import pandas as pd
import numpy as np
from scipy import stats
from matplotlib import pyplot as plt
import seaborn as sns
sns.set(style='whitegrid', rc={"grid.linewidth": 0.1})
sns.set_context("paper", font_scale=1.8)
Исследуемые параметры:
# чтение данных
df_plot = df = pd.read_csv('../Datasets/improved_08_2020.csv',index_col=0)
# выбор параметров
target_columns = ['AGE','GT','SBP','DBP','MBP','HR','IA','SpO2','Weight','Cl-','LACT','AMYL','ALT','AST','APTV','VOL_%','CI','B_surface','Diur_p_kg', 'OUTCOME']
df = df[['ID','Day'] + target_columns]
# переименование
df.columns = target_columns = ['ID','Day','Возраст','GT','САД', 'ДАД','СрАД','ЧСС','ИА','SpO2','Масса тела','Cl-','Лактат','Амилаза','АЛТ','АСТ','АЧТВ','Инфузия, % от N','КИ','Площадь тела','Диурез, мл/кг', 'OUTCOME']
# описательная статистика
df[2:].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 1390.0 | 89.139568 | 53.483134 | 1.000000 | 56.000000 | 84.000000 | 119.000000 | 216.000000 |
| Day | 1390.0 | 7.479137 | 7.851433 | 1.000000 | 2.000000 | 5.000000 | 9.000000 | 49.000000 |
| Возраст | 1390.0 | 9.973351 | 5.452043 | 0.250000 | 5.000000 | 11.000000 | 15.000000 | 18.000000 |
| GT | 1390.0 | 0.323022 | 0.467799 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 1.000000 |
| САД | 1390.0 | 111.279856 | 15.730912 | 45.000000 | 100.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 1390.0 | 64.853237 | 12.544982 | 5.000000 | 58.000000 | 65.000000 | 73.000000 | 119.000000 |
| СрАД | 1390.0 | 80.328777 | 12.699138 | 26.333333 | 73.333333 | 80.166667 | 88.333333 | 120.666667 |
| ЧСС | 1390.0 | 105.741727 | 23.503876 | 24.000000 | 90.000000 | 106.000000 | 120.000000 | 186.000000 |
| ИА | 1390.0 | 0.975362 | 0.294496 | 0.200000 | 0.781818 | 0.946333 | 1.105263 | 3.100000 |
| SpO2 | 1390.0 | 98.374820 | 3.334239 | 26.000000 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 1390.0 | 40.670504 | 22.671490 | 6.000000 | 19.000000 | 40.000000 | 60.000000 | 103.000000 |
| Cl- | 1390.0 | 108.032734 | 39.348603 | 0.000000 | 103.825000 | 109.000000 | 115.000000 | 1102.000000 |
| Лактат | 1390.0 | 1.469633 | 1.741236 | -1.100000 | 0.600000 | 1.200000 | 1.900000 | 25.000000 |
| Амилаза | 1390.0 | 99.058424 | 167.838425 | 0.000000 | 0.000000 | 53.400000 | 118.000000 | 2520.000000 |
| АЛТ | 1390.0 | 82.039957 | 163.595932 | 0.000000 | 21.500000 | 39.300000 | 78.325000 | 2865.000000 |
| АСТ | 1390.0 | 105.801597 | 210.000717 | 0.000000 | 31.300000 | 50.600000 | 98.300000 | 2458.300000 |
| АЧТВ | 1390.0 | 25.710683 | 17.771002 | 0.000000 | 20.587500 | 30.000000 | 35.000000 | 162.000000 |
| Инфузия, % от N | 1390.0 | 123.688991 | 53.620712 | 0.000000 | 94.802083 | 117.104186 | 143.567130 | 647.916667 |
| КИ | 1390.0 | 8.137281 | 32.743989 | 0.000000 | 0.000000 | 4.080000 | 5.000000 | 956.600000 |
| Площадь тела | 1390.0 | 0.955208 | 0.333813 | 0.250000 | 0.670000 | 1.030000 | 1.270000 | 1.450000 |
| Диурез, мл/кг | 1390.0 | 55.151606 | 35.221183 | 0.000000 | 30.785256 | 46.666667 | 72.000000 | 280.000000 |
df.ID.nunique()
203
В данном исследовании пациенты отбирались по следующим критериям:
* наличие сочетанной травмы;
* отсутствие сопутствующих заболеваний;
* возраст до 18 лет;
* необходимость лечения в отделении реанимации и интенсивной терапии.
На графиках бокс-плот видно, что выжившие и умершие пациенты, мальчики и девочки, имеют сходные массу тела и возраст.
df_plot = df_plot[['ID','AGE','SEX','OUTCOME','Weight','Day']].groupby('ID',as_index=False).max()
sns.boxplot(x=df_plot['OUTCOME'].replace({'Died':'умершие','Survived':'выжившие'}),y = df_plot['AGE'])
plt.ylabel('Возраст')
plt.xlabel('Исходы')
plt.show()
sns.boxplot(x=df_plot['OUTCOME'].replace({'Died':'умершие','Survived':'выжившие'}),y = df_plot['Weight'])
plt.ylabel('Масса тела')
plt.xlabel('Исходы')
plt.show()
sns.boxplot(x=df_plot['SEX'].replace({0:'девочки',1:'мальчики'}),y = df_plot['AGE'])
plt.ylabel('Возраст')
plt.xlabel('Пол')
plt.show()
sns.boxplot(x=df_plot['SEX'].replace({0:'девочки',1:'мальчики'}),y = df_plot['Weight'])
plt.ylabel('Масса тела')
plt.xlabel('Пол')
plt.show()
Первый день в ОРИТ:
значения клинико-лабораторных данных при поступлении (т.е. в первый день) могут сильно отличаться от средних значений соответствующих параметров каждого пациента в другие дни из-за проводимой терапии.
Проведенный ниже тест Вилкоксона показывает, что имеется существенная разница между параметрами в 1й день и средними значениями за последующие дни
from scipy.stats import wilcoxon
df0_ = df.loc[(df.Day>1)&(df.Day<=10),:].groupby('ID',as_index=False).mean().drop('Day',axis=1)
df1_ = df.loc[df.Day==1,:].drop('Day',axis=1)
ids = df0_.ID.unique() # смотрим только пациентов, которые оставались в ОРИТ в период 2-10 день
columns = list(df0_.columns[2:-1])
columns.remove('Масса тела')
columns.remove('Площадь тела')
results = []
for i in columns:
statistics, p = stats.wilcoxon(df0_[i],df1_[df1_.ID.isin(ids)][i])
results.append([i,round(p,3),f'Различие значимо' if p<0.05 else f'Не значимое различие'])
pd.DataFrame(results)
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | GT | 0.001 | Различие значимо |
| 1 | САД | 0.005 | Различие значимо |
| 2 | ДАД | 0.019 | Различие значимо |
| 3 | СрАД | 0.008 | Различие значимо |
| 4 | ЧСС | 0.000 | Различие значимо |
| 5 | ИА | 0.000 | Различие значимо |
| 6 | SpO2 | 0.685 | Не значимое различие |
| 7 | Cl- | 0.023 | Различие значимо |
| 8 | Лактат | 0.001 | Различие значимо |
| 9 | Амилаза | 0.000 | Различие значимо |
| 10 | АЛТ | 0.000 | Различие значимо |
| 11 | АСТ | 0.000 | Различие значимо |
| 12 | АЧТВ | 0.000 | Различие значимо |
| 13 | Инфузия, % от N | 0.000 | Различие значимо |
| 14 | КИ | 0.072 | Не значимое различие |
# 2 день и 3-10 дни
df0_ = df.loc[(df.Day!=1)&(df.Day!=2)&(df.Day<=10),:].groupby('ID',as_index=False).mean().drop('Day',axis=1)
df1_ = df.loc[df.Day==2,:].drop('Day',axis=1)
ids = df0_.ID.unique() # смотрим только пациентов, которые оставались в ОРИТ в период 3-10 день
columns = list(df0_.columns[2:-1])
columns.remove('Масса тела')
columns.remove('Площадь тела')
results = []
for i in columns:
statistics, p = stats.wilcoxon(df0_[i],df1_[df1_.ID.isin(ids)][i])
results.append([i,round(p,3),f'Различие значимо' if p<0.05 else f'Не значимое различие'])
print("Различия между значениями параметров на 2й день и средними значениями за последующие дни (до 10го дня)")
pd.DataFrame(results)
Различия между значениями параметров на 2й день и средними значениями за последующие дни (до 10го дня)
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | GT | 0.002 | Различие значимо |
| 1 | САД | 0.001 | Различие значимо |
| 2 | ДАД | 0.001 | Различие значимо |
| 3 | СрАД | 0.000 | Различие значимо |
| 4 | ЧСС | 0.000 | Различие значимо |
| 5 | ИА | 0.000 | Различие значимо |
| 6 | SpO2 | 0.012 | Различие значимо |
| 7 | Cl- | 0.012 | Различие значимо |
| 8 | Лактат | 0.072 | Не значимое различие |
| 9 | Амилаза | 0.278 | Не значимое различие |
| 10 | АЛТ | 0.000 | Различие значимо |
| 11 | АСТ | 0.000 | Различие значимо |
| 12 | АЧТВ | 0.336 | Не значимое различие |
| 13 | Инфузия, % от N | 0.020 | Различие значимо |
| 14 | КИ | 0.922 | Не значимое различие |
# в выборку за третий день не попал пациент №17 с неполностью заполненными полями
df[df.ID==17]
| ID | Day | Возраст | GT | САД | ДАД | СрАД | ЧСС | ИА | SpO2 | ... | Лактат | Амилаза | АЛТ | АСТ | АЧТВ | Инфузия, % от N | КИ | Площадь тела | Диурез, мл/кг | OUTCOME | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 91 | 17 | 1 | 4.0 | 1.0 | 100.0 | 65.0 | 76.666667 | 128.0 | 1.28000 | 98.0 | ... | 0.0 | 49.7 | 15.8 | 35.9 | 30.6 | 79.261364 | 0.0 | 0.61 | 62.5 | Survived |
| 92 | 17 | 2 | 4.0 | 0.0 | 107.0 | 54.0 | 71.666667 | 119.0 | 1.11215 | 100.0 | ... | 0.0 | 49.7 | 37.8 | 67.1 | 30.6 | 161.931818 | 0.0 | 0.61 | 43.5 | Survived |
| 93 | 17 | 4 | 4.0 | 0.0 | 107.0 | 54.0 | 71.666667 | 119.0 | 1.11215 | 98.0 | ... | 0.0 | 49.7 | 59.8 | 98.3 | 30.6 | 17.045455 | 0.0 | 0.61 | 5.0 | Survived |
3 rows × 22 columns
# 3 день и 4-10 дни
df0_ = df.loc[(~df.Day.isin([1,2,3]))&(df.Day<=10),:].groupby('ID',as_index=False).mean().drop('Day',axis=1)
df1_ = df.loc[df.Day==3,:].drop('Day',axis=1)
ids = df0_.ID.unique() # смотрим только пациентов, которые оставались в ОРИТ в период 4-10 день
ids = ids[~np.isin(ids,17)]
columns = list(df0_.columns[2:-1])
columns.remove('Масса тела')
columns.remove('Площадь тела')
results = []
for i in columns:
statistics, p = stats.wilcoxon(df0_[df0_.ID.isin(ids)][i],df1_[df1_.ID.isin(ids)][i])
results.append([i,round(p,3),f'Различие значимо' if p<0.05 else f'Не значимое различие'])
print("Различия между значениями параметров на 3й день и средними значениями за последующие дни (до 10го дня)")
pd.DataFrame(results)
Различия между значениями параметров на 3й день и средними значениями за последующие дни (до 10го дня)
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | GT | 0.000 | Различие значимо |
| 1 | САД | 0.011 | Различие значимо |
| 2 | ДАД | 0.310 | Не значимое различие |
| 3 | СрАД | 0.066 | Не значимое различие |
| 4 | ЧСС | 0.670 | Не значимое различие |
| 5 | ИА | 0.181 | Не значимое различие |
| 6 | SpO2 | 0.233 | Не значимое различие |
| 7 | Cl- | 0.000 | Различие значимо |
| 8 | Лактат | 0.511 | Не значимое различие |
| 9 | Амилаза | 0.017 | Различие значимо |
| 10 | АЛТ | 0.000 | Различие значимо |
| 11 | АСТ | 0.000 | Различие значимо |
| 12 | АЧТВ | 0.377 | Не значимое различие |
| 13 | Инфузия, % от N | 0.345 | Не значимое различие |
| 14 | КИ | 0.942 | Не значимое различие |
days = list(range(1,8))
df_all = df.loc[df.Day==7,'ID'].unique()
df_all = df.loc[(df.ID.isin(df_all))&(df.Day.isin(days)),:]
df_gt_users = df_all.loc[df_all.GT==1,'ID'].unique()
df_gt = df_all.loc[df_all.ID.isin(df_gt_users),:]
df_nogt = df_all.loc[~df_all.ID.isin(df_gt_users),:]
df_surv = df_all.loc[df_all.OUTCOME=='Survived',:]
# df_surv_gt_users = df_all.loc[(df_all.OUTCOME=='Survived')&(df_all.GT==1),'ID'].unique()
df_surv_gt = df_gt.loc[df_gt.OUTCOME=='Survived',:]
df_surv_nogt = df_nogt.loc[df_nogt.OUTCOME=='Survived',:]
df_died = df_all.loc[df_all.OUTCOME=='Died',:]
# df_died_gt_users = df_all.loc[(df_all.OUTCOME=='Died')&(df_all.GT==1),'ID'].unique()
df_died_gt = df_gt.loc[df_gt.OUTCOME=='Died',:]
df_died_nogt = df_nogt.loc[df_nogt.OUTCOME=='Died',:]
print(f'Всего пациентов, лечившихся 7 и более дней: {df_all.ID.nunique()}\n\
всего пациентов, получавших ГТ: {df_gt.ID.nunique()}\n\
всего пациентов, не получавших ГТ: {df_nogt.ID.nunique()}\n\
выживших пациентов: {df_surv.ID.nunique()}\n\
выживших, получавших ГТ: {df_surv_gt.ID.nunique()}\n\
выживших, не получавших ГТ: {df_surv_nogt.ID.nunique()}\n\
умерших пациентов: {df_died.ID.nunique()}\n\
умерших, получавших ГТ: {df_died_gt.ID.nunique()}\n\
умерших, не получавших ГТ: {df_died_nogt.ID.nunique()}\n\
')
Всего пациентов, лечившихся 7 и более дней: 82 всего пациентов, получавших ГТ: 58 всего пациентов, не получавших ГТ: 24 выживших пациентов: 68 выживших, получавших ГТ: 47 выживших, не получавших ГТ: 21 умерших пациентов: 14 умерших, получавших ГТ: 11 умерших, не получавших ГТ: 3
from scipy.stats import friedmanchisquare
def highlight(x):
color = 'lightgreen' if x<=0.01 else 'lightblue'
return 'background-color: %s' % color
params = list(set(df_all.columns[4:-1])-set(['Масса тела','Площадь тела']))
tab_lists = ['Все пациенты','Получали ГТ','Не получали ГТ', 'Выжили', 'Выжили, получали ГТ', 'Выжили, не получали ГТ', 'Умерли', 'Умерли, получали ГТ','Умерли, не получали ГТ']
results = []
for i in params:
# print('*'*5,i,'*'*(50-len(list(i))))
for k,z in enumerate([df_all,df_gt,df_nogt, df_surv, df_surv_gt, df_surv_nogt, df_died, df_died_gt, df_died_nogt]):
stat,p = friedmanchisquare(z.loc[z.Day==1,i],z.loc[z.Day==2,i],z.loc[z.Day==3,i],z.loc[z.Day==4,i],z.loc[z.Day==5,i],z.loc[z.Day==6,i],z.loc[z.Day==7,i])
# print(tab_lists[k],round(p,4))
results.append([i,tab_lists[k],round(p,4)])
a = pd.DataFrame(results)
a = a.pivot(columns = 1,index = 0,values = 2).rename_axis(None, axis=0).rename_axis('Параметры', axis=1).style.applymap(highlight)
a
| Параметры | Все пациенты | Выжили | Выжили, не получали ГТ | Выжили, получали ГТ | Не получали ГТ | Получали ГТ | Умерли | Умерли, не получали ГТ | Умерли, получали ГТ |
|---|---|---|---|---|---|---|---|---|---|
| Cl- | 0.000500 | 0.000000 | 0.168000 | 0.000200 | 0.453700 | 0.001400 | 0.338500 | 0.377600 | 0.723100 |
| SpO2 | 0.688800 | 0.628200 | 0.832300 | 0.239300 | 0.553100 | 0.182100 | 0.125100 | 0.034000 | 0.045100 |
| АЛТ | 0.002900 | 0.000400 | 0.011700 | 0.073800 | 0.024200 | 0.176000 | 0.889300 | 0.757400 | 0.929100 |
| АСТ | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.879500 | 0.821900 | 0.941300 |
| АЧТВ | 0.100100 | 0.035800 | 0.439300 | 0.083200 | 0.309800 | 0.280500 | 0.003500 | 0.098300 | 0.118500 |
| Амилаза | 0.000000 | 0.000000 | 0.001900 | 0.000000 | 0.001900 | 0.000000 | 0.667000 | 0.423200 | 0.423200 |
| ДАД | 0.001900 | 0.000200 | 0.442200 | 0.000100 | 0.093800 | 0.007800 | 0.808800 | 0.051600 | 0.145500 |
| Диурез, мл/кг | 0.000900 | 0.003300 | 0.376300 | 0.007800 | 0.291800 | 0.001100 | 0.506900 | 0.755500 | 0.157300 |
| ИА | 0.000100 | 0.000100 | 0.801500 | 0.000000 | 0.759700 | 0.000000 | 0.655800 | 0.715300 | 0.501000 |
| Инфузия, % от N | 0.000000 | 0.000000 | 0.093000 | 0.000100 | 0.111700 | 0.000100 | 0.868800 | 0.919700 | 0.727700 |
| КИ | 0.005700 | 0.006400 | 0.613500 | 0.014400 | 0.406300 | 0.023300 | 0.007300 | 0.126500 | 0.036400 |
| Лактат | 0.000400 | 0.000300 | 0.390500 | 0.000200 | 0.642400 | 0.000100 | 0.669200 | 0.657700 | 0.732100 |
| САД | 0.000200 | 0.000000 | 0.332000 | 0.000000 | 0.196200 | 0.000200 | 0.767100 | 0.174600 | 0.462500 |
| СрАД | 0.000300 | 0.000000 | 0.295400 | 0.000000 | 0.063800 | 0.001100 | 0.876100 | 0.033600 | 0.320400 |
| ЧСС | 0.011800 | 0.002800 | 0.678600 | 0.001500 | 0.666700 | 0.014900 | 0.517400 | 0.903600 | 0.274400 |
def highlight(x):
color = 'lightgreen' if x<=0.01 else 'lightblue'
return 'background-color: %s' % color
params = list(set(df_all.columns[4:-1])-set(['Масса тела','Площадь тела']))
tab_lists = ['Все пациенты','Получали ГТ','Не получали ГТ', 'Выжили', 'Выжили, получали ГТ', 'Выжили, не получали ГТ', 'Умерли', 'Умерли, получали ГТ','Умерли, не получали ГТ']
results = []
for i in params:
# print('*'*5,i,'*'*(50-len(list(i))))
for k,z in enumerate([df_all,df_gt,df_nogt, df_surv, df_surv_gt, df_surv_nogt, df_died, df_died_gt, df_died_nogt]):
stat,p = friedmanchisquare(z.loc[z.Day==2,i],z.loc[z.Day==3,i],z.loc[z.Day==4,i],z.loc[z.Day==5,i],z.loc[z.Day==6,i],z.loc[z.Day==7,i])
# print(tab_lists[k],round(p,4))
results.append([i,tab_lists[k],round(p,4)])
a = pd.DataFrame(results)
a = a.pivot(columns = 1,index = 0,values = 2).rename_axis(None, axis=0).rename_axis('Параметры', axis=1).style.applymap(highlight)
a
| Параметры | Все пациенты | Выжили | Выжили, не получали ГТ | Выжили, получали ГТ | Не получали ГТ | Получали ГТ | Умерли | Умерли, не получали ГТ | Умерли, получали ГТ |
|---|---|---|---|---|---|---|---|---|---|
| Cl- | 0.000300 | 0.000000 | 0.124400 | 0.000100 | 0.285600 | 0.001000 | 0.890300 | 0.897700 | 0.840200 |
| SpO2 | 0.530800 | 0.468800 | 0.633500 | 0.123900 | 0.579800 | 0.115200 | 0.043800 | 0.152000 | 0.018200 |
| АЛТ | 0.002700 | 0.000200 | 0.004200 | 0.062000 | 0.026000 | 0.116000 | 0.908600 | 0.971000 | 0.893100 |
| АСТ | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.847400 | 0.784800 | 0.870500 |
| АЧТВ | 0.517700 | 0.051500 | 0.470500 | 0.061700 | 0.549600 | 0.442100 | 0.002200 | 0.102600 | 0.067400 |
| Амилаза | 0.064100 | 0.109600 | 0.016000 | 0.642600 | 0.036500 | 0.539100 | 0.509100 | 0.415900 | 0.415900 |
| ДАД | 0.000600 | 0.000000 | 0.560300 | 0.000000 | 0.159300 | 0.006700 | 0.924700 | 0.068600 | 0.332600 |
| Диурез, мл/кг | 0.004600 | 0.017100 | 0.575500 | 0.011900 | 0.417400 | 0.001600 | 0.410800 | 0.670600 | 0.118700 |
| ИА | 0.009100 | 0.012200 | 0.979000 | 0.001400 | 0.953300 | 0.001100 | 0.598200 | 0.670600 | 0.547900 |
| Инфузия, % от N | 0.119600 | 0.191700 | 0.877900 | 0.187300 | 0.842400 | 0.096200 | 0.749800 | 0.787200 | 0.618000 |
| КИ | 0.977900 | 0.211500 | 0.635800 | 0.248200 | 0.763100 | 0.879800 | 0.014800 | 0.189300 | 0.027800 |
| Лактат | 0.007400 | 0.017000 | 0.325700 | 0.007800 | 0.443900 | 0.003500 | 0.604400 | 0.954000 | 0.593500 |
| САД | 0.000100 | 0.000000 | 0.182400 | 0.000000 | 0.122300 | 0.000100 | 0.521700 | 0.203100 | 0.300800 |
| СрАД | 0.000100 | 0.000000 | 0.417600 | 0.000000 | 0.157700 | 0.000500 | 0.830500 | 0.061400 | 0.476400 |
| ЧСС | 0.156300 | 0.184100 | 0.768200 | 0.083900 | 0.779400 | 0.102000 | 0.519800 | 0.794700 | 0.326600 |
def highlight(x):
color = 'lightgreen' if x<=0.01 else 'lightblue'
return 'background-color: %s' % color
params = list(set(df_all.columns[4:-1])-set(['Масса тела','Площадь тела']))
tab_lists = ['Все пациенты','Получали ГТ','Не получали ГТ', 'Выжили', 'Выжили, получали ГТ', 'Выжили, не получали ГТ', 'Умерли', 'Умерли, получали ГТ','Умерли, не получали ГТ']
results = []
for i in params:
# print('*'*5,i,'*'*(50-len(list(i))))
for k,z in enumerate([df_all,df_gt,df_nogt, df_surv, df_surv_gt, df_surv_nogt, df_died, df_died_gt, df_died_nogt]):
stat,p = friedmanchisquare(z.loc[z.Day==3,i],z.loc[z.Day==4,i],z.loc[z.Day==5,i],z.loc[z.Day==6,i],z.loc[z.Day==7,i])
# print(tab_lists[k],round(p,4))
results.append([i,tab_lists[k],round(p,4)])
a = pd.DataFrame(results)
a = a.pivot(columns = 1,index = 0,values = 2).rename_axis(None, axis=0).rename_axis('Параметры', axis=1).style.applymap(highlight)
a
| Параметры | Все пациенты | Выжили | Выжили, не получали ГТ | Выжили, получали ГТ | Не получали ГТ | Получали ГТ | Умерли | Умерли, не получали ГТ | Умерли, получали ГТ |
|---|---|---|---|---|---|---|---|---|---|
| Cl- | 0.000500 | 0.000000 | 0.356600 | 0.000100 | 0.521500 | 0.000400 | 0.934800 | 0.828400 | 0.784800 |
| SpO2 | 0.900000 | 0.375200 | 0.837300 | 0.248400 | 0.592700 | 0.850500 | 0.262700 | 0.171200 | 0.072900 |
| АЛТ | 0.059800 | 0.021200 | 0.104600 | 0.211900 | 0.268800 | 0.253100 | 0.869600 | 0.961300 | 0.829700 |
| АСТ | 0.000000 | 0.000000 | 0.005700 | 0.000000 | 0.006600 | 0.000000 | 0.627000 | 0.651500 | 0.685900 |
| АЧТВ | 0.185000 | 0.005400 | 0.640200 | 0.008900 | 0.849300 | 0.162500 | 0.000800 | 0.109300 | 0.018300 |
| Амилаза | 0.050200 | 0.115500 | 0.023800 | 0.594900 | 0.028300 | 0.479100 | 0.267400 | 0.406000 | 0.406000 |
| ДАД | 0.018900 | 0.001900 | 0.465500 | 0.003900 | 0.132800 | 0.166300 | 0.875100 | 0.069300 | 0.311800 |
| Диурез, мл/кг | 0.012100 | 0.030000 | 0.414100 | 0.128600 | 0.359400 | 0.052500 | 0.392400 | 0.569000 | 0.143500 |
| ИА | 0.784800 | 0.638700 | 0.902700 | 0.374400 | 0.858700 | 0.375800 | 0.855700 | 0.483000 | 0.576600 |
| Инфузия, % от N | 0.171200 | 0.212800 | 0.751000 | 0.184200 | 0.696000 | 0.104300 | 0.708900 | 0.615100 | 0.478600 |
| КИ | 0.910400 | 0.076400 | 0.423800 | 0.073600 | 0.550400 | 0.679400 | 0.027200 | 0.406000 | 0.019700 |
| Лактат | 0.426500 | 0.500700 | 0.341100 | 0.196800 | 0.508800 | 0.175100 | 0.830200 | 0.926100 | 0.793000 |
| САД | 0.000400 | 0.000000 | 0.074800 | 0.000200 | 0.045100 | 0.004500 | 0.587900 | 0.146000 | 0.201300 |
| СрАД | 0.014200 | 0.001800 | 0.350400 | 0.002900 | 0.162100 | 0.095400 | 0.731700 | 0.058600 | 0.376600 |
| ЧСС | 0.305800 | 0.394200 | 0.650400 | 0.567300 | 0.681000 | 0.452600 | 0.493700 | 0.572100 | 0.246200 |
ИТОГ:
Эти данные согласуются с проведенным ранее (см. выше) тестом Уилкоксона. При этом данный тест позволил выявить группы пациентов, в которых демонстрируются максимальные различия в параметрах на разных сроках лечения.
Ниже мы проследим за этими изменениями на графиках
tab_list = [df_all,df_gt,df_nogt, df_surv, df_surv_gt, df_surv_nogt, df_died, df_died_gt, df_died_nogt]
tab_lists = ['Все пациенты','Получали ГТ','Не получали ГТ', 'Выжили', 'Выжили, получали ГТ', 'Выжили, не получали ГТ', 'Умерли', 'Умерли, получали ГТ','Умерли, не получали ГТ']
fig,axis = plt.subplots(15,9,figsize = (30,75))
for k,z in enumerate(params):
if z!='КИ' and z!='Лактат':
y_max = df_all[z].max()
while y_max>(df_all[z].mean()*5):
y_max = y_max/5
y_min = df_all[z].min()
while y_min<(df_all[z].mean()/5):
y_min = (y_min+1)*5
elif z=='КИ':
y_max = 100
y_min = 0
elif z=='Лактат':
y_max = 20
y_min = 0
for kk,i in enumerate(tab_list):
sns.boxplot(x = tab_list[kk]['Day'], y = tab_list[kk][z],orient='vertical',ax=axis[k,kk],).set_ylabel(None)
axis[k,kk].set_title(f'{z}\n{tab_lists[kk]}')
axis[k,kk].set_ylim(y_min,y_max)
plt.tight_layout()
plt.show()
fig,axis = plt.subplots(15,9,figsize = (30,75))
for k,z in enumerate(params):
if z!='КИ' and z!='Лактат':
y_max = df_all[z].max()
while y_max>(df_all[z].mean()*5):
y_max = y_max/5
y_min = df_all[z].min()
while y_min<(df_all[z].mean()/5):
y_min = (y_min+1)*5
elif z=='КИ':
y_max = 100
y_min = 0
elif z=='Лактат':
y_max = 20
y_min = 0
for kk,i in enumerate(tab_list):
sns.lineplot(x = tab_list[kk]['Day'], y = tab_list[kk][z],ax=axis[k,kk],).set_ylabel(None)
axis[k,kk].set_title(f'{z}\n{tab_lists[kk]}')
axis[k,kk].set_ylim(y_min,y_max)
plt.tight_layout()
plt.show()
На графиках светло-голубым цветом обозначены доверительные интервалы средних значений: обращает на себя внимание разные доверительные интервалы средних значений для групп умерших и выживших (у выживших они Уже) и для подгрупп (ГТ+ и ГТ-) в этих же группах (в группах ГТ+ доверительные интервалы также Уже).
В связи с этим добавим новые признаки: 2 стандартных отклонения средних значений для каждого параметра в меньшую и большую сторону.
import warnings
warnings.filterwarnings("ignore")
for i in params:
i_std_min = str(i+'_std_min')
i_std_max = str(i+'_std_max')
for tab in tab_list:
tab[i_std_min] = tab[i].mean() - tab[i].std(ddof=1)*2 / np.sqrt(tab.shape[0])
tab[i_std_max] = tab[i].mean() + tab[i].std(ddof=1)*2 / np.sqrt(tab.shape[0])
Теперь с помощью метода Краскела-Уоллиса попытаемся определить, есть ли значимые различия между группами пациентов по изучаемым параметрам
Выбор данного критерия обусловлен непараметрическим распределением данных, независимостью анализируемых выборок (в сформированных группах пациенты не переходят из одной группы в другую) и количеством групп более 2.
pd.options.display.max_rows = 350
params2 = df_all.columns[2:].drop(['OUTCOME','GT'])
results2 = []
for day in days:
for i in params2:
stat, p = stats.kruskal(df_all.loc[df_all.Day==day,i],df_gt.loc[df_gt.Day==day,i],\
df_nogt.loc[df_nogt.Day==day,i], df_surv.loc[df_surv.Day==day,i],\
df_surv_gt.loc[df_surv_gt.Day==day,i], df_surv_nogt.loc[df_surv_nogt.Day==day,i],\
df_died.loc[df_died.Day==day,i], df_died_gt.loc[df_died_gt.Day==day,i],\
df_died_nogt.loc[df_died_nogt.Day==day,i])
if p<0.05:
results2.append([i,day,round(p,4)])
else:
results2.append([i,day,round(p,4)])
result2_df = pd.DataFrame(results2,columns=['Параметр','День','p-value'])
result2_df.groupby('Параметр',as_index=False).mean()[['Параметр','p-value']].sort_values('p-value')
| Параметр | p-value | |
|---|---|---|
| 23 | Диурез, мл/кг_std_max | 0.000000 |
| 46 | ЧСС_std_max | 0.000000 |
| 24 | Диурез, мл/кг_std_min | 0.000000 |
| 26 | ИА_std_max | 0.000000 |
| 27 | ИА_std_min | 0.000000 |
| 29 | Инфузия, % от N_std_max | 0.000000 |
| 30 | Инфузия, % от N_std_min | 0.000000 |
| 21 | ДАД_std_min | 0.000000 |
| 32 | КИ_std_max | 0.000000 |
| 35 | Лактат_std_max | 0.000000 |
| 36 | Лактат_std_min | 0.000000 |
| 40 | САД_std_max | 0.000000 |
| 41 | САД_std_min | 0.000000 |
| 43 | СрАД_std_max | 0.000000 |
| 44 | СрАД_std_min | 0.000000 |
| 33 | КИ_std_min | 0.000000 |
| 20 | ДАД_std_max | 0.000000 |
| 47 | ЧСС_std_min | 0.000000 |
| 8 | АЛТ_std_min | 0.000000 |
| 5 | SpO2_std_min | 0.000000 |
| 7 | АЛТ_std_max | 0.000000 |
| 17 | Амилаза_std_min | 0.000000 |
| 10 | АСТ_std_max | 0.000000 |
| 11 | АСТ_std_min | 0.000000 |
| 2 | Cl-_std_min | 0.000000 |
| 14 | АЧТВ_std_min | 0.000000 |
| 1 | Cl-_std_max | 0.000000 |
| 16 | Амилаза_std_max | 0.000000 |
| 13 | АЧТВ_std_max | 0.000000 |
| 4 | SpO2_std_max | 0.000000 |
| 15 | Амилаза | 0.000300 |
| 31 | КИ | 0.231814 |
| 12 | АЧТВ | 0.430814 |
| 9 | АСТ | 0.431086 |
| 6 | АЛТ | 0.523643 |
| 3 | SpO2 | 0.553143 |
| 25 | ИА | 0.579857 |
| 45 | ЧСС | 0.601100 |
| 37 | Масса тела | 0.643500 |
| 0 | Cl- | 0.644000 |
| 19 | ДАД | 0.646957 |
| 18 | Возраст | 0.651500 |
| 42 | СрАД | 0.681329 |
| 34 | Лактат | 0.773043 |
| 39 | САД | 0.785171 |
| 28 | Инфузия, % от N | 0.785643 |
| 38 | Площадь тела | 0.798700 |
| 22 | Диурез, мл/кг | 0.947043 |
Далее мы проведем поиск и анализ данных пациентов, значения параметров у которых "выбиваются" из ДИ среднего наиболее часто (использован порог 2/3 записей), т.е. будет предпринята попытка статистического анализа различий между выжившими и умершими пациентами, а также пациентами ГТ+ и ГТ-, которые наиболее сильно отклоняются от средних значений исследуемых параметров в своих группах; возможно, будет обнаружено значительное различие, например, в случае отклонения значений умерших пациентов в меньшую от среднего сторону, а выживших - в большую сторону от среднего значения.
Сначала составлен список пациентов, значения которых отклонялись более, чем на 1,96std
results3 = []
for k,tab in enumerate(tab_list):
for patient in tab.ID.unique():
for day in days:
checks_true = []
checks_false = []
for param in params:
std = tab.loc[tab['Day']==day,param].std(ddof=1)
mean = tab.loc[tab['Day']==day,param].mean()
if mean-1.96*std/np.sqrt(tab[tab['Day']==day].shape[0]) <= tab.loc[(tab['Day']==day)&(tab['ID']==patient),param].values < mean+1.96*std/np.sqrt(tab[tab['Day']==day].shape[0]):
checks_true.append(param)
else:
checks_false.append(param)
results3.append([tab_lists[k],patient,day,checks_true,checks_false])
# print(f'День {day}: {param} находится в пределах среднее +/- 2std' if df_all.loc[df_all['Day']==day,param].mean()-2*df_all.loc[df_all['Day']==day,param].std(ddof=1)<=df_all.loc[(df_all['Day']==day)&(df_all['ID']==patient),param].values<df_all.loc[df_all['Day']==day,param].mean()-2*df_all.loc[df_all['Day']==day,param].std(ddof=1) else f'День {day}: {param} находится за пределами среднее +/- 2std')
results3_df = pd.DataFrame(results3, columns = ['Группа пациентов','ID пациента','День лечения','Параметр в пределах среднее +/- 1.96std','Параметры за пределами среднее +/-1.96std'])
results3_df['Количество параметров за пределами 1.96std'] = [len(i) for i in results3_df['Параметры за пределами среднее +/-1.96std']]
results3_df.head()
| Группа пациентов | ID пациента | День лечения | Параметр в пределах среднее +/- 1.96std | Параметры за пределами среднее +/-1.96std | Количество параметров за пределами 1.96std | |
|---|---|---|---|---|---|---|
| 0 | Все пациенты | 3 | 1 | [Амилаза, Cl-, АЧТВ, Диурез, мл/кг] | [АСТ, ИА, ДАД, СрАД, КИ, АЛТ, SpO2, Лактат, ЧС... | 11 |
| 1 | Все пациенты | 3 | 2 | [Амилаза, Cl-] | [АСТ, ИА, ДАД, СрАД, КИ, АЧТВ, АЛТ, Диурез, мл... | 13 |
| 2 | Все пациенты | 3 | 3 | [Cl-, АЧТВ, Инфузия, % от N] | [Амилаза, АСТ, ИА, ДАД, СрАД, КИ, АЛТ, Диурез,... | 12 |
| 3 | Все пациенты | 3 | 4 | [Амилаза, АСТ, ДАД, СрАД, АЧТВ, ЧСС, САД] | [ИА, Cl-, КИ, АЛТ, Диурез, мл/кг, SpO2, Лактат... | 8 |
| 4 | Все пациенты | 3 | 5 | [АСТ, ДАД, СрАД, АЧТВ, САД] | [Амилаза, ИА, Cl-, КИ, АЛТ, Диурез, мл/кг, SpO... | 10 |
print("Количество значений, отклоняющихся от среднего более, чем на 1.96 std в группе ГТ-")
results3_df[results3_df['Группа пациентов']=='Не получали ГТ'].sort_values('Количество параметров за пределами 1.96std',ascending=False)['Количество параметров за пределами 1.96std'].sum()
Количество значений, отклоняющихся от среднего более, чем на 1.96 std в группе ГТ-
1655
print("Количество значений, отклоняющихся от среднего более, чем на 1.96 std в группе ГТ+")
results3_df[results3_df['Группа пациентов']=='Получали ГТ'].sort_values('Количество параметров за пределами 1.96std',ascending=False)['Количество параметров за пределами 1.96std'].sum()
Количество значений, отклоняющихся от среднего более, чем на 1.96 std в группе ГТ+
4431
Также получен список пациентов, значения которых отклонялись на 1std от среднего
results4 = []
for k,tab in enumerate(tab_list):
for patient in tab.ID.unique():
for day in days:
checks_true = []
checks_false = []
for param in params:
std = tab.loc[tab['Day']==day,param].std(ddof=1)
mean = tab.loc[tab['Day']==day,param].mean()
if mean-1*std/np.sqrt(tab[tab['Day']==day].shape[0]) <= tab.loc[(tab['Day']==day)&(tab['ID']==patient),param].values < mean+1*std/np.sqrt(tab[tab['Day']==day].shape[0]):
checks_true.append(param)
else:
checks_false.append(param)
results4.append([tab_lists[k],patient,day,checks_true,checks_false])
results4_df = pd.DataFrame(results4, columns = ['Группа пациентов','ID пациента','День лечения','Параметр в пределах среднее +/- 1std','Параметры за пределами среднее +/-1std'])
results4_df['Количество параметров за пределами 1std'] = [len(i) for i in results4_df['Параметры за пределами среднее +/-1std']]
results4_df.head()
| Группа пациентов | ID пациента | День лечения | Параметр в пределах среднее +/- 1std | Параметры за пределами среднее +/-1std | Количество параметров за пределами 1std | |
|---|---|---|---|---|---|---|
| 0 | Все пациенты | 3 | 1 | [АЧТВ, Диурез, мл/кг] | [Амилаза, АСТ, ИА, Cl-, ДАД, СрАД, КИ, АЛТ, Sp... | 13 |
| 1 | Все пациенты | 3 | 2 | [Cl-] | [Амилаза, АСТ, ИА, ДАД, СрАД, КИ, АЧТВ, АЛТ, Д... | 14 |
| 2 | Все пациенты | 3 | 3 | [Инфузия, % от N] | [Амилаза, АСТ, ИА, Cl-, ДАД, СрАД, КИ, АЧТВ, А... | 14 |
| 3 | Все пациенты | 3 | 4 | [Амилаза, АСТ, ДАД, СрАД] | [ИА, Cl-, КИ, АЧТВ, АЛТ, Диурез, мл/кг, SpO2, ... | 11 |
| 4 | Все пациенты | 3 | 5 | [АСТ, ДАД, СрАД, САД] | [Амилаза, ИА, Cl-, КИ, АЧТВ, АЛТ, Диурез, мл/к... | 11 |
print("Количество значений, отклоняющихся от среднего более, чем на 1 std в группе ГТ-")
results4_df[results4_df['Группа пациентов']=='Не получали ГТ'].sort_values('Количество параметров за пределами 1std',ascending=False)['Количество параметров за пределами 1std'].sum()
Количество значений, отклоняющихся от среднего более, чем на 1 std в группе ГТ-
2092
print("Количество значений, отклоняющихся от среднего более, чем на 1 std в группе ГТ+")
results4_df[results4_df['Группа пациентов']=='Получали ГТ'].sort_values('Количество параметров за пределами 1std',ascending=False)['Количество параметров за пределами 1std'].sum()
Количество значений, отклоняющихся от среднего более, чем на 1 std в группе ГТ+
5249
print(f'{len(params)} параметров\n{df_gt.ID.nunique()} пациентов получали ГТ\n{df_nogt.ID.nunique()} пациентов не получали ГТ')
15 параметров 58 пациентов получали ГТ 24 пациентов не получали ГТ
Итак: всего 15 наблюдаемых параметров
В группе не получавших ГТ: 24 пациентов - и в ней всего 1655 из 15х24х7=2520 (т.е. 65.67%) записей не попадают в пределы средних значений.
В группе, получавшей ГТ: 58 пациента - и в ней всего 4431 из 15(параметров)х58(пациентов)х7(дней)=6090 (т.е. 72.76%) записей не попадают в пределы средних значений
В группе не получавших ГТ: 24 пациентов - и в ней всего 2092 из 15х24х7=2520 (т.е. 83.02%) записей не попадают в пределы средних значений.
В группе, получавшей ГТ: 58 пациента - и в ней всего 5249 из 15(параметров)х58(пациентов)х7(дней)=6090 (т.е. 86.19%) записей не попадают в пределы средних значений
Ниже мы посмотрим, что это за пациенты: сколько параметров у каждого из них далеко отстоит от среднего по выборке (т.е. "группе").
a = results3_df[results3_df['Группа пациентов']=='Получали ГТ'].sort_values('Количество параметров за пределами 1.96std',ascending=False).groupby(['ID пациента','День лечения'],as_index=False)['Количество параметров за пределами 1.96std'].sum()
# a.head(50)
b = results3_df[results3_df['Группа пациентов']=='Не получали ГТ'].sort_values('Количество параметров за пределами 1.96std',ascending=False).groupby(['ID пациента','День лечения'],as_index=False)['Количество параметров за пределами 1.96std'].sum()
# b
a = a.rename(columns={'ID пациента':'ID'}).groupby('ID',as_index=False).sum().sort_values('Количество параметров за пределами 1.96std')[['ID','Количество параметров за пределами 1.96std']].merge(df.groupby('ID',as_index=False)[['Day','OUTCOME']].max(),on='ID',how='left')
a['Количество записей'] = 15 * a['Day']
a['За переделами ДИ, %'] = a['Количество параметров за пределами 1.96std'] * 100 / a['Количество записей']
a.sort_values('За переделами ДИ, %',ascending=False)
| ID | Количество параметров за пределами 1.96std | Day | OUTCOME | Количество записей | За переделами ДИ, % | |
|---|---|---|---|---|---|---|
| 53 | 94 | 90 | 7 | Died | 105 | 85.714286 |
| 56 | 201 | 98 | 8 | Survived | 120 | 81.666667 |
| 49 | 125 | 85 | 7 | Survived | 105 | 80.952381 |
| 47 | 49 | 84 | 7 | Survived | 105 | 80.000000 |
| 43 | 128 | 82 | 7 | Died | 105 | 78.095238 |
| 44 | 121 | 82 | 7 | Survived | 105 | 78.095238 |
| 45 | 122 | 82 | 7 | Died | 105 | 78.095238 |
| 55 | 79 | 93 | 8 | Died | 120 | 77.500000 |
| 35 | 6 | 80 | 7 | Survived | 105 | 76.190476 |
| 38 | 8 | 80 | 7 | Survived | 105 | 76.190476 |
| 50 | 55 | 86 | 8 | Survived | 120 | 71.666667 |
| 42 | 208 | 82 | 8 | Survived | 120 | 68.333333 |
| 57 | 179 | 98 | 10 | Survived | 150 | 65.333333 |
| 8 | 212 | 68 | 7 | Survived | 105 | 64.761905 |
| 9 | 41 | 68 | 7 | Survived | 105 | 64.761905 |
| 31 | 50 | 77 | 8 | Survived | 120 | 64.166667 |
| 26 | 53 | 76 | 8 | Survived | 120 | 63.333333 |
| 25 | 40 | 75 | 8 | Survived | 120 | 62.500000 |
| 48 | 200 | 84 | 9 | Survived | 135 | 62.222222 |
| 46 | 92 | 84 | 9 | Died | 135 | 62.222222 |
| 21 | 116 | 74 | 8 | Survived | 120 | 61.666667 |
| 54 | 34 | 90 | 10 | Survived | 150 | 60.000000 |
| 36 | 108 | 80 | 9 | Survived | 135 | 59.259259 |
| 17 | 103 | 71 | 8 | Survived | 120 | 59.166667 |
| 15 | 37 | 70 | 8 | Survived | 120 | 58.333333 |
| 12 | 84 | 69 | 8 | Survived | 120 | 57.500000 |
| 11 | 89 | 69 | 8 | Died | 120 | 57.500000 |
| 5 | 81 | 67 | 8 | Survived | 120 | 55.833333 |
| 7 | 39 | 67 | 8 | Survived | 120 | 55.833333 |
| 3 | 57 | 64 | 8 | Survived | 120 | 53.333333 |
| 51 | 214 | 87 | 11 | Survived | 165 | 52.727273 |
| 13 | 97 | 69 | 9 | Survived | 135 | 51.111111 |
| 28 | 58 | 76 | 10 | Died | 150 | 50.666667 |
| 27 | 19 | 76 | 10 | Survived | 150 | 50.666667 |
| 40 | 205 | 80 | 12 | Died | 180 | 44.444444 |
| 14 | 71 | 70 | 11 | Survived | 165 | 42.424242 |
| 39 | 96 | 80 | 13 | Died | 195 | 41.025641 |
| 33 | 65 | 77 | 13 | Survived | 195 | 39.487179 |
| 1 | 70 | 59 | 10 | Survived | 150 | 39.333333 |
| 0 | 213 | 51 | 9 | Survived | 135 | 37.777778 |
| 32 | 68 | 77 | 15 | Survived | 225 | 34.222222 |
| 19 | 87 | 73 | 15 | Survived | 225 | 32.444444 |
| 30 | 31 | 77 | 16 | Survived | 240 | 32.083333 |
| 41 | 64 | 81 | 17 | Survived | 255 | 31.764706 |
| 34 | 95 | 78 | 17 | Died | 255 | 30.588235 |
| 6 | 32 | 67 | 15 | Survived | 225 | 29.777778 |
| 29 | 18 | 76 | 18 | Survived | 270 | 28.148148 |
| 20 | 74 | 73 | 18 | Survived | 270 | 27.037037 |
| 23 | 33 | 74 | 19 | Survived | 285 | 25.964912 |
| 37 | 59 | 80 | 21 | Survived | 315 | 25.396825 |
| 4 | 3 | 65 | 19 | Survived | 285 | 22.807018 |
| 24 | 61 | 75 | 22 | Survived | 330 | 22.727273 |
| 52 | 88 | 88 | 27 | Survived | 405 | 21.728395 |
| 16 | 90 | 70 | 25 | Died | 375 | 18.666667 |
| 10 | 86 | 69 | 30 | Survived | 450 | 15.333333 |
| 2 | 85 | 62 | 31 | Survived | 465 | 13.333333 |
| 18 | 60 | 72 | 42 | Survived | 630 | 11.428571 |
| 22 | 120 | 74 | 49 | Survived | 735 | 10.068027 |
b = b.rename(columns={'ID пациента':'ID'}).groupby('ID',as_index=False).sum().sort_values('Количество параметров за пределами 1.96std')[['ID','Количество параметров за пределами 1.96std']].merge(df.groupby('ID',as_index=False)[['Day','OUTCOME']].max(),on='ID',how='left')
b['Количество записей'] = 15 * b['Day']
b['За переделами ДИ, %'] = a['Количество параметров за пределами 1.96std'] * 100 / a['Количество записей']
b.sort_values('За переделами ДИ, %',ascending=False)
| ID | Количество параметров за пределами 1.96std | Day | OUTCOME | Количество записей | За переделами ДИ, % | |
|---|---|---|---|---|---|---|
| 8 | 83 | 64 | 12 | Survived | 180 | 64.761905 |
| 9 | 51 | 68 | 8 | Survived | 120 | 64.761905 |
| 21 | 45 | 79 | 8 | Survived | 120 | 61.666667 |
| 17 | 82 | 74 | 9 | Survived | 135 | 59.166667 |
| 15 | 129 | 73 | 7 | Died | 105 | 58.333333 |
| 12 | 72 | 71 | 12 | Survived | 180 | 57.500000 |
| 11 | 93 | 70 | 11 | Died | 165 | 57.500000 |
| 5 | 99 | 61 | 8 | Survived | 120 | 55.833333 |
| 7 | 105 | 62 | 11 | Survived | 165 | 55.833333 |
| 3 | 63 | 59 | 19 | Survived | 285 | 53.333333 |
| 13 | 75 | 71 | 12 | Survived | 180 | 51.111111 |
| 14 | 62 | 72 | 35 | Survived | 525 | 42.424242 |
| 1 | 119 | 58 | 10 | Survived | 150 | 39.333333 |
| 0 | 67 | 57 | 16 | Survived | 240 | 37.777778 |
| 19 | 66 | 75 | 8 | Died | 120 | 32.444444 |
| 6 | 98 | 61 | 8 | Survived | 120 | 29.777778 |
| 20 | 54 | 76 | 7 | Survived | 105 | 27.037037 |
| 23 | 203 | 86 | 12 | Survived | 180 | 25.964912 |
| 4 | 7 | 61 | 7 | Survived | 105 | 22.807018 |
| 16 | 211 | 73 | 11 | Survived | 165 | 18.666667 |
| 10 | 115 | 69 | 7 | Survived | 105 | 15.333333 |
| 2 | 46 | 59 | 8 | Survived | 120 | 13.333333 |
| 18 | 47 | 74 | 8 | Survived | 120 | 11.428571 |
| 22 | 29 | 82 | 9 | Survived | 135 | 10.068027 |
patients = a[a['За переделами ДИ, %']>35]['ID'].unique()
df.loc[df.ID.isin(patients),['ID','OUTCOME']].groupby('ID').min().sort_values('OUTCOME').value_counts()
OUTCOME Survived 31 Died 9 dtype: int64
tab_list = [df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Died'),:],df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Survived'),:]]
tab_lists = ['Умерли, >35% значений выходят за рамки 1.96 std','Выжили, >35% значений выходят за рамки 1.96 std']
fig,axis = plt.subplots(15,2,figsize = (30,75))
for k,z in enumerate(params):
if z!='КИ' and z!='Лактат':
y_max = df_all[z].max()
while y_max>(df_all[z].mean()*5):
y_max = y_max/5
y_min = df_all[z].min()
while y_min<(df_all[z].mean()/5):
y_min = (y_min+1)*5
elif z=='КИ':
y_max = 100
y_min = 0
elif z=='Лактат':
y_max = 20
y_min = 0
for kk,i in enumerate(tab_list):
sns.lineplot(x = tab_list[kk]['Day'], y = tab_list[kk][z],ax=axis[k,kk],).set_ylabel(None)
axis[k,kk].set_title(f'{z}\n{tab_lists[kk]}')
axis[k,kk].set_ylim(y_min,y_max)
plt.tight_layout()
plt.show()
tab_list = [df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Died'),:],df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Died')&(df.GT==1),:]]
tab_lists = ['Умерли, >5% значений выходят за рамки 1.96 std','Умерли, <5% значений выходят за рамки 1.96 std']
fig,axis = plt.subplots(15,2,figsize = (30,75))
for k,z in enumerate(params):
if z!='КИ' and z!='Лактат':
y_max = df_all[z].max()
while y_max>(df_all[z].mean()*5):
y_max = y_max/5
y_min = df_all[z].min()
while y_min<(df_all[z].mean()/5):
y_min = (y_min+1)*5
elif z=='КИ':
y_max = 100
y_min = 0
elif z=='Лактат':
y_max = 20
y_min = 0
for kk,i in enumerate(tab_list):
sns.lineplot(x = tab_list[kk]['Day'], y = tab_list[kk][z],ax=axis[k,kk],).set_ylabel(None)
axis[k,kk].set_title(f'{z}\n{tab_lists[kk]}')
axis[k,kk].set_ylim(y_min,y_max)
plt.tight_layout()
plt.show()
tab_list = [df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Survived'),:],df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Survived')&(df.GT==1),:]]
tab_lists = ['Выжили, >5% значений выходят за рамки 1.96 std','Выжили, <5% значений выходят за рамки 1.96 std']
fig,axis = plt.subplots(15,2,figsize = (30,75))
for k,z in enumerate(params):
if z!='КИ' and z!='Лактат':
y_max = df_all[z].max()
while y_max>(df_all[z].mean()*5):
y_max = y_max/5
y_min = df_all[z].min()
while y_min<(df_all[z].mean()/5):
y_min = (y_min+1)*5
elif z=='КИ':
y_max = 100
y_min = 0
elif z=='Лактат':
y_max = 20
y_min = 0
for kk,i in enumerate(tab_list):
sns.lineplot(x = tab_list[kk]['Day'], y = tab_list[kk][z],ax=axis[k,kk],).set_ylabel(None)
axis[k,kk].set_title(f'{z}\n{tab_lists[kk]}')
axis[k,kk].set_ylim(y_min,y_max)
plt.tight_layout()
plt.show()
# Умершие и получавшие ГТ, выходящие >5% раз за пределы 1.96 std
df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Died'),params].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Амилаза | 81.0 | 15.716049 | 65.716291 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 485.000000 |
| АСТ | 81.0 | 138.992593 | 230.256034 | 0.000000 | 38.000000 | 104.000000 | 120.500000 | 1678.400000 |
| ИА | 81.0 | 1.071906 | 0.419976 | 0.512500 | 0.811966 | 1.000000 | 1.196078 | 3.100000 |
| Cl- | 81.0 | 105.944444 | 38.500568 | 0.000000 | 101.500000 | 111.000000 | 124.000000 | 159.000000 |
| ДАД | 81.0 | 59.543210 | 17.674169 | 17.000000 | 50.000000 | 60.000000 | 75.000000 | 99.000000 |
| СрАД | 81.0 | 74.962963 | 20.015827 | 26.333333 | 60.000000 | 75.666667 | 90.000000 | 120.666667 |
| КИ | 81.0 | 24.203704 | 44.244829 | 0.000000 | 4.000000 | 7.500000 | 20.000000 | 246.000000 |
| АЧТВ | 81.0 | 25.203704 | 22.245755 | 0.000000 | 0.000000 | 29.000000 | 38.000000 | 120.000000 |
| АЛТ | 81.0 | 107.038272 | 164.535558 | 0.000000 | 42.800000 | 66.000000 | 112.000000 | 1293.200000 |
| Диурез, мл/кг | 81.0 | 54.841746 | 37.424546 | 2.325581 | 31.000000 | 42.500000 | 70.930233 | 179.500000 |
| SpO2 | 81.0 | 96.469136 | 4.965094 | 69.000000 | 97.000000 | 98.000000 | 99.000000 | 100.000000 |
| Лактат | 81.0 | 1.553704 | 2.819195 | 0.000000 | 0.000000 | 0.000000 | 2.200000 | 13.000000 |
| ЧСС | 81.0 | 106.716049 | 25.233031 | 41.000000 | 95.000000 | 105.000000 | 121.000000 | 186.000000 |
| САД | 81.0 | 105.802469 | 26.448261 | 45.000000 | 89.000000 | 102.000000 | 120.000000 | 165.000000 |
| Инфузия, % от N | 81.0 | 137.262723 | 49.689497 | 11.952941 | 107.954545 | 133.058824 | 167.058824 | 300.176471 |
# Умершие и получавшие ГТ, выходящие <5% раз за пределы 1.96 std
zz = df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Died')&(df.GT==1),'ID'].unique()
df.loc[df['ID'].isin(zz),params].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Амилаза | 51.0 | 37.117647 | 155.360439 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 892.000000 |
| АСТ | 51.0 | 249.749020 | 359.553565 | 0.000000 | 135.750000 | 183.000000 | 241.000000 | 2458.300000 |
| ИА | 51.0 | 0.981681 | 0.310853 | 0.464000 | 0.834250 | 0.939759 | 1.004505 | 2.285714 |
| Cl- | 51.0 | 104.198039 | 54.367492 | 1.200000 | 107.000000 | 122.000000 | 139.000000 | 193.000000 |
| ДАД | 51.0 | 58.294118 | 15.811760 | 30.000000 | 46.500000 | 58.000000 | 70.000000 | 93.000000 |
| СрАД | 51.0 | 72.660131 | 15.457970 | 43.333333 | 60.166667 | 73.333333 | 85.000000 | 105.333333 |
| КИ | 51.0 | 31.649020 | 134.363695 | 0.000000 | 5.000000 | 7.500000 | 12.500000 | 956.600000 |
| АЧТВ | 51.0 | 14.760784 | 41.795861 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 162.000000 |
| АЛТ | 51.0 | 150.007843 | 396.617281 | 0.000000 | 37.000000 | 113.000000 | 113.000000 | 2865.000000 |
| Диурез, мл/кг | 51.0 | 55.783472 | 32.164732 | 0.000000 | 38.666667 | 56.666667 | 72.166667 | 169.230769 |
| SpO2 | 51.0 | 97.196078 | 4.841568 | 70.000000 | 98.000000 | 98.000000 | 99.000000 | 100.000000 |
| Лактат | 51.0 | 3.309804 | 4.422850 | 0.000000 | 0.000000 | 2.200000 | 4.700000 | 20.000000 |
| ЧСС | 51.0 | 97.156863 | 23.931045 | 50.000000 | 85.000000 | 98.000000 | 110.000000 | 160.000000 |
| САД | 51.0 | 101.392157 | 18.328206 | 60.000000 | 90.000000 | 108.000000 | 115.000000 | 136.000000 |
| Инфузия, % от N | 51.0 | 106.096787 | 36.034563 | 22.773279 | 81.849436 | 98.082192 | 124.295094 | 238.833333 |
# Выжившие и получавшие ГТ, выходящие >5% раз за пределы 1.96 std
df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Survived'),params].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Амилаза | 264.0 | 104.539356 | 140.185331 | 0.000000 | 0.000000 | 53.500000 | 145.200000 | 858.100000 |
| АСТ | 264.0 | 106.268750 | 196.706595 | 0.000000 | 30.437500 | 48.700000 | 95.250000 | 1958.500000 |
| ИА | 264.0 | 0.946932 | 0.301329 | 0.461538 | 0.771576 | 0.904762 | 1.060256 | 2.800000 |
| Cl- | 264.0 | 112.119129 | 61.881770 | 0.000000 | 104.000000 | 108.300000 | 113.000000 | 1102.000000 |
| ДАД | 264.0 | 65.439394 | 12.718513 | 20.000000 | 57.750000 | 65.000000 | 72.500000 | 100.000000 |
| СрАД | 264.0 | 80.969697 | 12.533888 | 30.000000 | 73.333333 | 80.000000 | 88.666667 | 117.666667 |
| КИ | 264.0 | 4.190379 | 9.015911 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 80.000000 |
| АЧТВ | 264.0 | 25.939015 | 14.291912 | 0.000000 | 25.000000 | 30.000000 | 33.825000 | 90.000000 |
| АЛТ | 264.0 | 85.005303 | 170.427448 | 0.000000 | 17.500000 | 31.100000 | 80.550000 | 1885.200000 |
| Диурез, мл/кг | 264.0 | 56.487498 | 35.743002 | 6.250000 | 29.982143 | 48.166667 | 75.000000 | 213.333333 |
| SpO2 | 264.0 | 97.981061 | 5.143162 | 26.000000 | 97.000000 | 99.000000 | 100.000000 | 110.000000 |
| Лактат | 264.0 | 1.341288 | 1.833689 | 0.000000 | 0.000000 | 1.200000 | 1.800000 | 25.000000 |
| ЧСС | 264.0 | 103.299242 | 23.211325 | 60.000000 | 88.750000 | 102.000000 | 116.000000 | 173.000000 |
| САД | 264.0 | 112.030303 | 14.845946 | 50.000000 | 105.000000 | 110.000000 | 120.000000 | 163.000000 |
| Инфузия, % от N | 264.0 | 121.912989 | 40.242297 | 0.000000 | 94.843750 | 118.958333 | 140.916667 | 247.916667 |
# Выжившие и получавшие ГТ, выходящие <5% раз за пределы 1.96 std
zz = df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Survived')&(df.GT==1),'ID'].unique()
df.loc[df['ID'].isin(zz),params].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Амилаза | 554.0 | 138.084513 | 192.806744 | 0.000000 | 42.250000 | 79.000000 | 160.450000 | 1940.000000 |
| АСТ | 554.0 | 82.380325 | 168.885571 | 0.000000 | 30.925000 | 47.000000 | 71.200000 | 2130.600000 |
| ИА | 554.0 | 0.972563 | 0.266893 | 0.200000 | 0.783385 | 0.937278 | 1.104809 | 2.133333 |
| Cl- | 554.0 | 107.688357 | 31.358233 | 0.000000 | 104.000000 | 108.000000 | 116.000000 | 507.000000 |
| ДАД | 554.0 | 66.402527 | 11.813135 | 5.000000 | 60.000000 | 65.000000 | 75.000000 | 110.000000 |
| СрАД | 554.0 | 81.938026 | 11.496082 | 40.000000 | 73.333333 | 83.333333 | 90.000000 | 116.666667 |
| КИ | 554.0 | 6.798755 | 16.423892 | 0.000000 | 0.000000 | 5.000000 | 6.212500 | 199.200000 |
| АЧТВ | 554.0 | 27.551895 | 14.050507 | 0.000000 | 25.500000 | 30.825000 | 34.950000 | 125.000000 |
| АЛТ | 554.0 | 62.231480 | 102.358792 | 0.000000 | 24.800000 | 38.890000 | 62.000000 | 1260.700000 |
| Диурез, мл/кг | 554.0 | 53.807995 | 35.933750 | 1.571429 | 30.000000 | 45.116883 | 68.592857 | 280.000000 |
| SpO2 | 554.0 | 98.862816 | 1.830806 | 76.000000 | 98.000000 | 100.000000 | 100.000000 | 100.000000 |
| Лактат | 554.0 | 1.477708 | 1.135600 | -1.100000 | 0.900000 | 1.300000 | 2.000000 | 9.000000 |
| ЧСС | 554.0 | 107.792419 | 23.099327 | 24.000000 | 90.000000 | 110.000000 | 120.000000 | 180.000000 |
| САД | 554.0 | 113.009025 | 13.640897 | 70.000000 | 105.000000 | 114.500000 | 120.000000 | 170.000000 |
| Инфузия, % от N | 554.0 | 127.957408 | 62.434988 | 14.166667 | 96.937500 | 118.229167 | 143.802083 | 647.916667 |
pd.options.display.max_rows = 350
# params2 = df_all.columns[2:].drop(['OUTCOME','GT'])
results5 = []
df1 = df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Survived'),:] # выжили, имели >35% случаев отклонения более 1.96*std
df2 = df.loc[(df.ID.isin(patients))&(df.OUTCOME=='Died'),:] # умерли, имели >35% случаев отклонения более 1.96*std
df3 = df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Survived')&(df.GT==1),:] # выжили, имели <35% случаев отклонения более 1.96*std
df4 = df.loc[(~df.ID.isin(patients))&(df.OUTCOME=='Died')&(df.GT==1),:] # умерли, имели <35% случаев отклонения более 2*std
for day in days:
for i in params:
stat, p = stats.kruskal(df1.loc[df1.Day==day,i],df2.loc[df2.Day==day,i],df3.loc[df3.Day==day,i],df4.loc[df4.Day==day,i])
# print('*'*50)
# print(i)
if p<0.05:
results5.append([i,day,round(p,4)])
# print('Доказана существенная разница:',p)
else:
results5.append([i,day,round(p,4)])
# print('Разница не доказана:',p)
results5_df = pd.DataFrame(results5,columns=['Параметр','День','p-value'])
results5_df.groupby('Параметр',as_index=False).mean()[['Параметр','p-value']].sort_values('p-value')
| Параметр | p-value | |
|---|---|---|
| 5 | Амилаза | 0.030986 |
| 0 | Cl- | 0.041643 |
| 10 | КИ | 0.084800 |
| 1 | SpO2 | 0.141471 |
| 3 | АСТ | 0.219786 |
| 4 | АЧТВ | 0.242843 |
| 6 | ДАД | 0.287314 |
| 2 | АЛТ | 0.327914 |
| 14 | ЧСС | 0.330371 |
| 9 | Инфузия, % от N | 0.334571 |
| 11 | Лактат | 0.358029 |
| 13 | СрАД | 0.408086 |
| 12 | САД | 0.521814 |
| 8 | ИА | 0.550043 |
| 7 | Диурез, мл/кг | 0.647329 |
Как видно, при различных принципах формирования выборок для сравнения, убедительных данных о значимом различии выборок между собой по принципу использования ГТ не наблюдается.
Далее мы попытаемся оценить различия между группами пациентов в случаях однократного (в первый день) и многократного (больше одного дня, а также однократного после 1го дня) использования ГТ.
Просмотр первых 5 записей
# 1й день - день поступления пациента
df_1 = df[df['Day']==1].copy()
df_1.head()
| ID | Day | Возраст | GT | САД | ДАД | СрАД | ЧСС | ИА | SpO2 | ... | Лактат | Амилаза | АЛТ | АСТ | АЧТВ | Инфузия, % от N | КИ | Площадь тела | Диурез, мл/кг | OUTCOME | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 6.00 | 0.0 | 100.0 | 65.0 | 76.666667 | 108.0 | 1.080000 | 100.0 | ... | 0.0 | 94.2 | 50.2 | 86.0 | 23.6 | 130.487805 | 0.0 | 0.7300 | 43.500000 | Survived |
| 6 | 2 | 1 | 0.42 | 0.0 | 100.0 | 66.0 | 77.333333 | 115.0 | 1.150000 | 100.0 | ... | 0.0 | 18.3 | 31.3 | 46.0 | 31.5 | 124.255952 | 5.0 | 0.2908 | 23.571429 | Survived |
| 12 | 3 | 1 | 13.00 | 1.0 | 120.0 | 80.0 | 93.333333 | 80.0 | 0.666667 | 100.0 | ... | 0.0 | 38.8 | 40.8 | 90.3 | 26.0 | 73.750000 | 0.0 | 1.1500 | 50.909091 | Survived |
| 31 | 4 | 1 | 8.00 | 0.0 | 110.0 | 65.0 | 80.000000 | 124.0 | 1.127273 | 100.0 | ... | 0.0 | 15.3 | 11.2 | 35.3 | 29.1 | 294.736842 | 5.0 | 0.8500 | 25.666667 | Survived |
| 36 | 5 | 1 | 11.00 | 1.0 | 115.0 | 75.0 | 88.333333 | 110.0 | 0.956522 | 98.0 | ... | 0.0 | 65.6 | 27.4 | 52.5 | 26.9 | 36.666667 | 0.0 | 1.0300 | 29.400000 | Survived |
5 rows × 22 columns
Описательная статистика: группа 1
# Пациенты, которые получали ГТ имеют параметр GT=1
df_1_1 = df_1[df_1['GT']==1].loc[:,target_columns]
df_1_1.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 88.0 | 106.375000 | 64.528228 | 3.000000 | 47.750000 | 99.500000 | 162.250000 | 215.000000 |
| Day | 88.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 88.0 | 8.797348 | 5.160294 | 0.250000 | 4.000000 | 8.500000 | 13.000000 | 17.000000 |
| GT | 88.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 88.0 | 104.795455 | 21.548213 | 45.000000 | 90.000000 | 106.500000 | 118.500000 | 155.000000 |
| ДАД | 88.0 | 60.034091 | 15.818256 | 17.000000 | 50.000000 | 60.500000 | 70.000000 | 100.000000 |
| СрАД | 88.0 | 74.954545 | 16.927098 | 26.333333 | 66.666667 | 77.666667 | 85.666667 | 113.333333 |
| ЧСС | 88.0 | 111.465909 | 24.578726 | 54.000000 | 96.000000 | 112.500000 | 122.000000 | 172.000000 |
| ИА | 88.0 | 1.128057 | 0.422854 | 0.412903 | 0.855820 | 1.078499 | 1.273694 | 2.800000 |
| SpO2 | 88.0 | 97.272727 | 8.681765 | 26.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 88.0 | 36.119318 | 22.140875 | 6.000000 | 18.000000 | 30.000000 | 51.250000 | 100.000000 |
| Cl- | 88.0 | 90.795455 | 44.170079 | 0.000000 | 100.675000 | 105.700000 | 111.000000 | 200.400000 |
| Лактат | 88.0 | 1.955682 | 2.824599 | 0.000000 | 0.000000 | 1.250000 | 2.800000 | 17.000000 |
| Амилаза | 88.0 | 34.459091 | 66.605895 | 0.000000 | 0.000000 | 0.000000 | 43.975000 | 329.200000 |
| АЛТ | 88.0 | 144.100000 | 397.108247 | 0.000000 | 15.650000 | 31.650000 | 95.325000 | 2865.000000 |
| АСТ | 88.0 | 208.950000 | 428.146292 | 0.000000 | 27.875000 | 58.200000 | 162.650000 | 2458.300000 |
| АЧТВ | 88.0 | 16.502273 | 19.595425 | 0.000000 | 0.000000 | 0.000000 | 30.000000 | 90.000000 |
| Инфузия, % от N | 88.0 | 96.841263 | 67.828810 | 0.000000 | 54.614504 | 79.737634 | 116.593750 | 353.009259 |
| КИ | 88.0 | 19.281364 | 106.323936 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 956.600000 |
| Площадь тела | 88.0 | 0.943977 | 0.310832 | 0.250000 | 0.610000 | 1.030000 | 1.210000 | 1.450000 |
| Диурез, мл/кг | 88.0 | 41.803068 | 32.895691 | 0.000000 | 13.722222 | 33.458333 | 63.072082 | 179.166667 |
Описательная статистика: группа 2
# Пациенты, которые не получали ГТ имеют параметр GT=0
df_1_0 = df_1[df_1['GT']==0].loc[:,target_columns]
df_1_0.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 115.0 | 102.408696 | 59.924499 | 1.000000 | 53.000000 | 102.000000 | 150.000000 | 216.000000 |
| Day | 115.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 115.0 | 9.192725 | 5.549760 | 0.250000 | 4.000000 | 9.000000 | 14.500000 | 18.000000 |
| GT | 115.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| САД | 115.0 | 106.460870 | 17.396454 | 70.000000 | 92.500000 | 110.000000 | 120.000000 | 159.000000 |
| ДАД | 115.0 | 63.678261 | 13.223814 | 30.000000 | 55.500000 | 60.000000 | 70.000000 | 119.000000 |
| СрАД | 115.0 | 77.939130 | 13.730104 | 43.333333 | 68.833333 | 77.333333 | 86.333333 | 117.333333 |
| ЧСС | 115.0 | 109.913043 | 22.587671 | 40.000000 | 92.000000 | 110.000000 | 125.000000 | 165.000000 |
| ИА | 115.0 | 1.069361 | 0.327999 | 0.407692 | 0.825121 | 1.000000 | 1.211702 | 2.133333 |
| SpO2 | 115.0 | 98.252174 | 3.942222 | 70.000000 | 98.000000 | 100.000000 | 100.000000 | 100.000000 |
| Масса тела | 115.0 | 35.856522 | 21.586197 | 6.000000 | 16.000000 | 30.000000 | 50.000000 | 103.000000 |
| Cl- | 115.0 | 95.575652 | 38.278129 | 0.000000 | 100.850000 | 107.000000 | 113.000000 | 148.000000 |
| Лактат | 115.0 | 1.716522 | 3.064652 | 0.000000 | 0.000000 | 1.000000 | 2.500000 | 25.000000 |
| Амилаза | 115.0 | 35.780870 | 61.518358 | 0.000000 | 0.000000 | 15.300000 | 50.850000 | 533.500000 |
| АЛТ | 115.0 | 122.497826 | 236.534967 | 0.000000 | 12.600000 | 36.000000 | 97.250000 | 1260.700000 |
| АСТ | 115.0 | 172.971043 | 358.602569 | 0.000000 | 0.000000 | 53.100000 | 140.700000 | 2242.000000 |
| АЧТВ | 115.0 | 17.027826 | 16.857767 | 0.000000 | 0.000000 | 23.500000 | 31.000000 | 58.000000 |
| Инфузия, % от N | 115.0 | 95.429568 | 63.586685 | 0.000000 | 56.039136 | 79.166667 | 122.143500 | 295.701754 |
| КИ | 115.0 | 6.584783 | 32.661305 | 0.000000 | 0.000000 | 0.000000 | 1.250000 | 320.000000 |
| Площадь тела | 115.0 | 0.883384 | 0.334534 | 0.250000 | 0.610000 | 0.850000 | 1.210000 | 1.390000 |
| Диурез, мл/кг | 115.0 | 39.011873 | 34.131423 | 0.000000 | 15.250000 | 30.303030 | 54.916667 | 205.384615 |
# сравнение средних
a = pd.DataFrame(df_1_1[target_columns[2:-1]].mean()).rename(columns = {0:'Группа 1: получает ГТ'})
a_ = []
for i in target_columns[2:-1]:
a_.append(df_1_0[df_1_0[i]>0][i].mean())
a['Группа 2: не получает ГТ'] = a_
a
| Группа 1: получает ГТ | Группа 2: не получает ГТ | |
|---|---|---|
| Возраст | 8.797348 | 9.192725 |
| GT | 1.000000 | NaN |
| САД | 104.795455 | 106.460870 |
| ДАД | 60.034091 | 63.678261 |
| СрАД | 74.954545 | 77.939130 |
| ЧСС | 111.465909 | 109.913043 |
| ИА | 1.128057 | 1.069361 |
| SpO2 | 97.272727 | 98.252174 |
| Масса тела | 36.119318 | 35.856522 |
| Cl- | 90.795455 | 109.912000 |
| Лактат | 1.955682 | 2.902941 |
| Амилаза | 34.459091 | 66.367742 |
| АЛТ | 144.100000 | 156.525000 |
| АСТ | 208.950000 | 234.019647 |
| АЧТВ | 16.502273 | 32.101639 |
| Инфузия, % от N | 96.841263 | 100.682572 |
| КИ | 19.281364 | 26.112069 |
| Площадь тела | 0.943977 | 0.883384 |
| Диурез, мл/кг | 41.803068 | 41.928649 |
При простом сравнении средних значений видны не самые сильные различия, которые можно было бы ожидать: в группе, получавшей ГТ чуть меньше АД, чуть выше ЧСС и индекс Альговера, ниже уровень ионов хлора, АЛТ, АСТ, АЧТВ, объем назначенной инфузии и катехоламинов.
Заранее можно сказать, что такие близкие значения средних, даже при значимости различий, являются признаком того, что величины параметров в двух группах сильно перекрываются, а значит, не смогут служить явной границей между этими группами пациентов. Однако, они могут иметь пользу для алгоритмов машинного обучения, которые могут анализировать влияние большого количества факторов на целевую переменную.
# Размер выборки
print(f'Количество пациентов в группах:\nПервая группа\t{df_1_1.ID.nunique()}\nВторая группа\t{df_1_0.ID.nunique()}')
Количество пациентов в группах: Первая группа 88 Вторая группа 115
sns.barplot(data = [[0],[df_1_1.ID.nunique()],[df_1_0.ID.nunique()]])
plt.xlim(0.5)
plt.title('Размер групп');
Гистограммы построены для того, чтобы визуально оценить нормальность распределения признаков: видно, что только в случае среднего артериального давления в группе без ГТ можно наблюдать близкое к нормальному распределение. Поэтому дальше мы будем использовать непараметрический тест Краскела-Уоллиса для независимых выборок разного размера.
На этих гистограммах также более удобно оценить медиану (изучается в тесте Краскела-Уоллиса) каждого параметра.
figure,ax = plt.subplots(len(target_columns[4:-1]),2,figsize=(14,60))
sns.set(style='whitegrid', rc={"grid.linewidth": 0.1})
sns.set_context("paper", font_scale=1.8)
for k,i in enumerate(target_columns[4:-1]):
sns.histplot(df_1[df_1['GT']==0][i],bins=10,ax=ax[k,0])
sns.histplot(df_1[df_1['GT']==1][i],bins=10,ax=ax[k,1])
ax[k,0].set_title(i+' (без гормонотерапии)')
ax[k,1].set_title(i+' (с гормонотерапией)')
ax[k,0].set(ylabel='Количество')
ax[k,1].set(ylabel='Количество')
plt.tight_layout()
columns = ['Вариант','Показатель','Значимость различий','p_value','alpha']
append_list = []
for k,i in enumerate(target_columns[4:-1]):
group0 = df_1[df_1['GT']==0][i]
group1 = df_1[df_1['GT']==1][i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Этап 1',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Этап 1',i,'обнаружены значимые различия',p,alpha])
# Для текстового вывода результатов - раскомментируйте данные строки;
# if alpha<p:
# print(f'Разница по параметру {i} между двумя группами не доказана.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
# else:
# print(f'По параметру {i} наблюдается статистически достоверная разница между двумя группами.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
# Составление списков пациентов получавших ГТ более 1 дня и только один (первый) день
# выбираем из датасета df Day>1, GT = 1 и только тех пациентов, которые находятся в списке df_1_gt_1 (получали ГТ в первый день)
df_1_gt_1 = df.loc[(df.GT==1) & (df.Day==1),'ID'].unique()
a = df.loc[(df['Day']>1)&(df['ID'].isin(df_1_gt_1)),:].groupby('ID', as_index=False).max()
df_gt_more1day = df.loc[df.ID.isin(a.loc[a.GT==1,'ID']),:]
print(f'{df_gt_more1day["ID"].nunique()} получали ГТ более 1 дня.')
# есть данные и за 1 и за остальные дни; но в первый день они получали ГТ, а в др.дни - не получали
df_gt_only1day = df.loc[df.ID.isin(a.loc[a.GT==0,'ID']),:]
print(f'{df_gt_only1day["ID"].nunique()} получали ГТ только в 1й день')
67 получали ГТ более 1 дня. 12 получали ГТ только в 1й день
# не было ни одного пациента, который бы получал ГТ и находился в ОРИТ только 1 день
df.loc[(df['Day'].max()==1)&(df['ID'].isin(df_1_gt_1)),:].groupby('ID', as_index=False).max().shape[0]
0
# Размер выборки
print(f'Количество пациентов в группах:\nПервая группа\t{df_gt_only1day.ID.nunique()}\nВторая группа\t{df_gt_more1day.ID.nunique()}')
Количество пациентов в группах: Первая группа 12 Вторая группа 67
sns.barplot(data = [[0],[df_gt_only1day["ID"].nunique()],[df_gt_more1day["ID"].nunique()]])
plt.xlim(0.5)
plt.title('Размер групп');
Описательная статистика: 1 группа
# Описательная статистика пациентов, которые получали ГТ только в 1й день
df_gt_only1day[target_columns[2:]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 62.0 | 7.338710 | 3.922167 | 3.000000 | 4.000000 | 6.125000 | 11.750000 | 15.000000 |
| GT | 62.0 | 0.193548 | 0.398304 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 |
| САД | 62.0 | 110.774194 | 13.216258 | 80.000000 | 102.750000 | 113.500000 | 118.750000 | 150.000000 |
| ДАД | 62.0 | 63.887097 | 12.420376 | 35.000000 | 55.000000 | 63.000000 | 70.000000 | 100.000000 |
| СрАД | 62.0 | 79.516129 | 11.562561 | 50.000000 | 73.083333 | 77.500000 | 85.750000 | 116.666667 |
| ЧСС | 62.0 | 101.145161 | 19.627554 | 60.000000 | 89.000000 | 98.500000 | 118.250000 | 165.000000 |
| ИА | 62.0 | 0.933377 | 0.257408 | 0.500000 | 0.780200 | 0.865385 | 1.065152 | 2.062500 |
| SpO2 | 62.0 | 98.774194 | 2.321809 | 90.000000 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 62.0 | 32.741935 | 22.338627 | 12.000000 | 15.000000 | 21.500000 | 57.500000 | 70.000000 |
| Cl- | 62.0 | 100.972581 | 27.622521 | 0.000000 | 101.175000 | 106.100000 | 110.750000 | 129.000000 |
| Лактат | 62.0 | 0.732258 | 1.322538 | 0.000000 | 0.000000 | 0.000000 | 1.300000 | 7.400000 |
| Амилаза | 62.0 | 43.848387 | 48.114034 | 0.000000 | 0.000000 | 33.000000 | 64.475000 | 186.000000 |
| АЛТ | 62.0 | 59.146774 | 69.878751 | 5.700000 | 18.975000 | 27.200000 | 74.900000 | 370.300000 |
| АСТ | 62.0 | 81.050000 | 87.296940 | 16.800000 | 38.000000 | 52.500000 | 98.300000 | 604.200000 |
| АЧТВ | 62.0 | 27.727419 | 12.050977 | 0.000000 | 26.962500 | 29.200000 | 33.675000 | 45.100000 |
| Инфузия, % от N | 62.0 | 106.657416 | 41.176714 | 16.607595 | 82.251450 | 107.430341 | 131.557349 | 205.625000 |
| КИ | 62.0 | 2.338710 | 6.121565 | 0.000000 | 0.000000 | 0.000000 | 4.375000 | 40.000000 |
| Площадь тела | 62.0 | 1.062903 | 0.245993 | 0.550000 | 0.910000 | 1.090000 | 1.255000 | 1.390000 |
| Диурез, мл/кг | 62.0 | 58.592842 | 37.278234 | 5.000000 | 29.060526 | 51.416667 | 83.333333 | 179.166667 |
Описательная статистика: 2 группа
# Описательная статистика пациентов, которые получали ГТ в 1й и любой (любые) последующие дни
df_gt_more1day[target_columns[2:]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 548.0 | 10.438564 | 5.361711 | 0.250000 | 5.000000 | 12.000000 | 16.000000 | 17.000000 |
| GT | 548.0 | 0.653285 | 0.476359 | 0.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 548.0 | 112.124088 | 17.412910 | 45.000000 | 104.000000 | 112.500000 | 120.000000 | 165.000000 |
| ДАД | 548.0 | 65.399635 | 13.792632 | 5.000000 | 60.000000 | 65.000000 | 75.000000 | 100.000000 |
| СрАД | 548.0 | 80.974453 | 14.174995 | 26.333333 | 73.333333 | 81.666667 | 90.083333 | 120.666667 |
| ЧСС | 548.0 | 105.155109 | 23.767145 | 41.000000 | 88.750000 | 105.000000 | 120.000000 | 186.000000 |
| ИА | 548.0 | 0.966663 | 0.312359 | 0.412903 | 0.775182 | 0.909091 | 1.090909 | 3.100000 |
| SpO2 | 548.0 | 98.155109 | 4.290591 | 26.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 548.0 | 42.937956 | 22.495475 | 6.000000 | 20.000000 | 45.000000 | 60.000000 | 100.000000 |
| Cl- | 548.0 | 108.689507 | 52.394270 | 0.000000 | 103.000000 | 108.000000 | 114.250000 | 1102.000000 |
| Лактат | 548.0 | 1.680292 | 2.082401 | 0.000000 | 0.000000 | 1.300000 | 2.100000 | 20.000000 |
| Амилаза | 548.0 | 129.325255 | 212.679433 | 0.000000 | 0.000000 | 49.300000 | 172.025000 | 1940.000000 |
| АЛТ | 548.0 | 88.304927 | 193.484734 | 0.000000 | 23.437500 | 42.800000 | 78.750000 | 2865.000000 |
| АСТ | 548.0 | 121.884215 | 234.818416 | 0.000000 | 34.975000 | 55.500000 | 116.000000 | 2458.300000 |
| АЧТВ | 548.0 | 23.420712 | 17.319862 | 0.000000 | 0.000000 | 27.800000 | 34.050000 | 120.000000 |
| Инфузия, % от N | 548.0 | 120.204809 | 51.909820 | 0.000000 | 89.583333 | 112.729691 | 138.134470 | 552.083333 |
| КИ | 548.0 | 9.804051 | 25.599881 | 0.000000 | 0.000000 | 4.500000 | 7.500000 | 246.000000 |
| Площадь тела | 548.0 | 1.013130 | 0.314869 | 0.250000 | 0.790000 | 1.090000 | 1.270000 | 1.450000 |
| Диурез, мл/кг | 548.0 | 47.774219 | 28.806952 | 1.571429 | 28.000000 | 42.500000 | 58.150106 | 179.500000 |
# сравнение средних
a = pd.DataFrame(df_gt_more1day[target_columns[2:-1]].mean()).rename(columns = {0:'ГТ\: 1 и последующие дни'})
a_ = []
for i in target_columns[2:-1]:
a_.append(df_gt_only1day[df_gt_only1day[i]>0][i].mean())
a['ГТ: только 1й день'] = a_
a
| ГТ\: 1 и последующие дни | ГТ: только 1й день | |
|---|---|---|
| Возраст | 10.438564 | 7.338710 |
| GT | 0.653285 | 1.000000 |
| САД | 112.124088 | 110.774194 |
| ДАД | 65.399635 | 63.887097 |
| СрАД | 80.974453 | 79.516129 |
| ЧСС | 105.155109 | 101.145161 |
| ИА | 0.966663 | 0.933377 |
| SpO2 | 98.155109 | 98.774194 |
| Масса тела | 42.937956 | 32.741935 |
| Cl- | 108.689507 | 107.936207 |
| Лактат | 1.680292 | 2.063636 |
| Амилаза | 129.325255 | 66.307317 |
| АЛТ | 88.304927 | 59.146774 |
| АСТ | 121.884215 | 81.050000 |
| АЧТВ | 23.420712 | 31.835185 |
| Инфузия, % от N | 120.204809 | 106.657416 |
| КИ | 9.804051 | 7.631579 |
| Площадь тела | 1.013130 | 1.062903 |
| Диурез, мл/кг | 47.774219 | 58.592842 |
В данном случае мы добавили график QQ-плот (квантиль-квантиль), т.к. в некоторых случаях при просмотре гистограмм неочевидно, что параметры имеют непараметрическое распределение.
# for k,i in enumerate(target_columns[3:]):
# print('Параметр =',i,'\nСреднее = ',df_gt_more1day[i].mean(),'std =',df_gt_more1day[i].std(ddof=1))
figure,ax = plt.subplots(len(target_columns[3:]),4,figsize=(19,70))
for k,i in enumerate(target_columns[3:]):
try:
sns.histplot(df_gt_more1day[i],bins=10,ax=ax[k,0])
interval = np.linspace(0,1,int(df_gt_more1day[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_gt_more1day[i].count())),loc=df_gt_more1day[i].mean(),scale=df_gt_more1day[i].std(ddof=1))
y = np.quantile(df_gt_more1day[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,1],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,1],color='b')
sns.scatterplot(x = np.linspace(0,int(df_gt_more1day[i].max()),int(df_gt_more1day[i].count())),y = df_gt_more1day[i],ax=ax[k,1],color='grey')
sns.histplot(df_gt_only1day[i],bins=10,ax=ax[k,2])
interval = np.linspace(0,1,int(df_gt_only1day[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_gt_only1day[i].count())),loc=df_gt_only1day[i].mean(),scale=df_gt_only1day[i].std(ddof=1))
y = np.quantile(df_gt_only1day[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,3],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,3],color='b')
sns.scatterplot(x = np.linspace(0,int(df_gt_only1day[i].max()),int(df_gt_only1day[i].count())),y = df_gt_only1day[i],ax=ax[k,3],color='grey')
ax[k,0].set_title(i+' (ГТ более 1 дня)')
ax[k,1].set_title(i+' (ГТ более 1 дня: QQ-plot)')
ax[k,2].set_title(i+' (ГТ только 1 день)')
ax[k,3].set_title(i+' (ГТ только 1 день: QQ-plot)')
plt.tight_layout()
except Exception:
ax[k,0].set_title(i+' (ГТ более 1 дня)')
ax[k,1].set_title(i+' (ГТ более 1 дня: QQ-plot)')
ax[k,2].set_title(i+' (ГТ только 1 день)')
ax[k,3].set_title(i+' (ГТ только 1 день: QQ-plot)')
plt.tight_layout()
pass
for k,i in enumerate(target_columns[3:-1]):
group0 = df_gt_more1day[i]
group1 = df_gt_only1day[i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Этап 2',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Этап 2',i,'обнаружены значимые различия',p,alpha])
# if alpha<p:
# print(f'Разница по параметру {i} между двумя группами не доказана.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
# else:
# print(f'По параметру {i} наблюдается статистически достоверная разница между двумя группами.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
Между двумя группами (см. результаты в сводной таблице ниже) обнаружены статистически значимые различия по большинству параметров:
Обращает на себя внимание то, что в группе с ГТ 1 день снижены КИ и волемическая нагрузка.
# df_gt_only1day - пациенты получают ГТ только в 1й день
df_not1_users = df.loc[(~df['ID'].isin(df_1_gt_1))&(df.GT==1),'ID']
df_not1 = df.loc[df.ID.isin(df_not1_users),:]
print(f' Размер первой группы = {df_gt_only1day.ID.nunique()}')
Размер первой группы = 12
print(f' Размер второй группы = {df_not1.ID.nunique()}')
Размер второй группы = 25
df_gt_only1day[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 62.0 | 7.338710 | 3.922167 | 3.000000 | 4.000000 | 6.125000 | 11.750000 | 15.000000 |
| САД | 62.0 | 110.774194 | 13.216258 | 80.000000 | 102.750000 | 113.500000 | 118.750000 | 150.000000 |
| ДАД | 62.0 | 63.887097 | 12.420376 | 35.000000 | 55.000000 | 63.000000 | 70.000000 | 100.000000 |
| СрАД | 62.0 | 79.516129 | 11.562561 | 50.000000 | 73.083333 | 77.500000 | 85.750000 | 116.666667 |
| ЧСС | 62.0 | 101.145161 | 19.627554 | 60.000000 | 89.000000 | 98.500000 | 118.250000 | 165.000000 |
| ИА | 62.0 | 0.933377 | 0.257408 | 0.500000 | 0.780200 | 0.865385 | 1.065152 | 2.062500 |
| SpO2 | 62.0 | 98.774194 | 2.321809 | 90.000000 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 62.0 | 32.741935 | 22.338627 | 12.000000 | 15.000000 | 21.500000 | 57.500000 | 70.000000 |
| Cl- | 62.0 | 100.972581 | 27.622521 | 0.000000 | 101.175000 | 106.100000 | 110.750000 | 129.000000 |
| Лактат | 62.0 | 0.732258 | 1.322538 | 0.000000 | 0.000000 | 0.000000 | 1.300000 | 7.400000 |
| Амилаза | 62.0 | 43.848387 | 48.114034 | 0.000000 | 0.000000 | 33.000000 | 64.475000 | 186.000000 |
| АЛТ | 62.0 | 59.146774 | 69.878751 | 5.700000 | 18.975000 | 27.200000 | 74.900000 | 370.300000 |
| АСТ | 62.0 | 81.050000 | 87.296940 | 16.800000 | 38.000000 | 52.500000 | 98.300000 | 604.200000 |
| АЧТВ | 62.0 | 27.727419 | 12.050977 | 0.000000 | 26.962500 | 29.200000 | 33.675000 | 45.100000 |
| Инфузия, % от N | 62.0 | 106.657416 | 41.176714 | 16.607595 | 82.251450 | 107.430341 | 131.557349 | 205.625000 |
| КИ | 62.0 | 2.338710 | 6.121565 | 0.000000 | 0.000000 | 0.000000 | 4.375000 | 40.000000 |
| Площадь тела | 62.0 | 1.062903 | 0.245993 | 0.550000 | 0.910000 | 1.090000 | 1.255000 | 1.390000 |
| Диурез, мл/кг | 62.0 | 58.592842 | 37.278234 | 5.000000 | 29.060526 | 51.416667 | 83.333333 | 179.166667 |
df_not1[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 331.0 | 10.277002 | 5.753904 | 0.750000 | 5.000000 | 14.000000 | 15.000000 | 17.000000 |
| САД | 331.0 | 110.873112 | 13.746919 | 70.000000 | 100.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 331.0 | 64.891239 | 11.953963 | 30.000000 | 55.500000 | 65.000000 | 75.000000 | 110.000000 |
| СрАД | 331.0 | 80.218530 | 11.624494 | 46.666667 | 71.833333 | 80.000000 | 90.000000 | 116.666667 |
| ЧСС | 331.0 | 107.743202 | 23.686409 | 24.000000 | 90.000000 | 109.000000 | 120.500000 | 180.000000 |
| ИА | 331.0 | 0.989235 | 0.267801 | 0.200000 | 0.810795 | 0.970874 | 1.109244 | 2.056338 |
| SpO2 | 331.0 | 98.564955 | 1.922241 | 82.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 331.0 | 39.172205 | 21.802536 | 7.500000 | 15.000000 | 50.000000 | 50.000000 | 80.000000 |
| Cl- | 331.0 | 110.595619 | 26.136629 | 0.000000 | 106.000000 | 111.000000 | 121.000000 | 169.000000 |
| Лактат | 331.0 | 1.493656 | 1.587438 | -1.100000 | 1.000000 | 1.300000 | 1.900000 | 25.000000 |
| Амилаза | 331.0 | 101.735257 | 98.828671 | 0.000000 | 50.075000 | 72.000000 | 129.700000 | 551.600000 |
| АЛТ | 331.0 | 63.625196 | 95.087580 | 0.000000 | 24.250000 | 38.880000 | 62.025000 | 1260.700000 |
| АСТ | 331.0 | 77.497281 | 145.253672 | 0.000000 | 28.400000 | 47.000000 | 74.700000 | 2130.600000 |
| АЧТВ | 331.0 | 31.275831 | 17.886899 | 0.000000 | 28.775000 | 32.000000 | 34.800000 | 162.000000 |
| Инфузия, % от N | 331.0 | 140.936967 | 58.596349 | 14.166667 | 109.687500 | 129.787234 | 160.270833 | 647.916667 |
| КИ | 331.0 | 5.961178 | 7.383817 | 0.000000 | 1.250000 | 5.000000 | 7.500000 | 90.000000 |
| Площадь тела | 331.0 | 0.829743 | 0.330500 | 0.250000 | 0.610000 | 0.670000 | 1.210000 | 1.390000 |
| Диурез, мл/кг | 331.0 | 66.512032 | 42.196608 | 2.000000 | 37.500000 | 53.300000 | 88.794444 | 280.000000 |
# сравнение средних
a = pd.DataFrame(df_gt_only1day[target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: получает ГТ'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df_not1[df_not1[i]>0][i].mean())
a['Группа 2: не получает ГТ'] = a_
a
| Группа 1: получает ГТ | Группа 2: не получает ГТ | |
|---|---|---|
| Возраст | 7.338710 | 10.277002 |
| САД | 110.774194 | 110.873112 |
| ДАД | 63.887097 | 64.891239 |
| СрАД | 79.516129 | 80.218530 |
| ЧСС | 101.145161 | 107.743202 |
| ИА | 0.933377 | 0.989235 |
| SpO2 | 98.774194 | 98.564955 |
| Масса тела | 32.741935 | 39.172205 |
| Cl- | 100.972581 | 111.948471 |
| Лактат | 0.732258 | 1.702749 |
| Амилаза | 43.848387 | 114.538673 |
| АЛТ | 59.146774 | 64.799815 |
| АСТ | 81.050000 | 81.692994 |
| АЧТВ | 27.727419 | 34.623077 |
| Инфузия, % от N | 106.657416 | 140.936967 |
| КИ | 2.338710 | 7.956250 |
| Площадь тела | 1.062903 | 0.829743 |
| Диурез, мл/кг | 58.592842 | 66.512032 |
sns.barplot(data = [[0],[df_gt_only1day.ID.nunique()],[df_not1.ID.nunique()]])
plt.xlim(0.5)
plt.title('Размер групп');
# for k,i in enumerate(target_columns[3:]):
# print('Параметр =',i,'\nСреднее = ',df_gt_more1day[i].mean(),'std =',df_gt_more1day[i].std(ddof=1))
figure,ax = plt.subplots(len(target_columns[3:-1]),4,figsize=(19,70))
for k,i in enumerate(target_columns[3:-1]):
try:
sns.histplot(df_gt_only1day[i],bins=10,ax=ax[k,0])
interval = np.linspace(0,1,int(df_gt_only1day[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_gt_only1day[i].count())),loc=df_gt_only1day[i].mean(),scale=df_gt_only1day[i].std(ddof=1))
y = np.quantile(df_gt_only1day[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,1],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,1],color='b')
sns.scatterplot(x = np.linspace(0,int(df_gt_only1day[i].max()),int(df_gt_only1day[i].count())),y = df_gt_only1day[i],ax=ax[k,1],color='grey')
sns.histplot(df_not1[i],bins=10,ax=ax[k,2])
interval = np.linspace(0,1,int(df_not1[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_not1[i].count())),loc=df_not1[i].mean(),scale=df_not1[i].std(ddof=1))
y = np.quantile(df_not1[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,3],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,3],color='b')
sns.scatterplot(x = np.linspace(0,int(df_not1[i].max()),int(df_not1[i].count())),y = df_not1[i],ax=ax[k,3],color='grey')
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
except Exception:
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
pass
for k,i in enumerate(target_columns[3:-1]):
group0 = df_gt_only1day[i]
group1 = df_not1[i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Этап 3',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Этап 3',i,'обнаружены значимые различия',p,alpha])
# if alpha<p:
# print(f'Разница по параметру {i} между двумя группами не доказана.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
# else:
# print(f'По параметру {i} наблюдается статистически достоверная разница между двумя группами.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
результаты представлены в сводной таблице (см. ниже)
# df_gt_only1day - пациенты получают ГТ только в 1й день
df_only1 = df.loc[df.ID.isin(df_gt_only1day.ID.unique()),:]
# поле GT будет содержать 1, если пациент получал ГТ в какой-нибудь день
a = df.groupby('ID',as_index=False)['GT'].max()
users = a.loc[a['GT']==1,'ID'].values
df_noGT = df.loc[~df.ID.isin(users),:]
df_only1[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 62.0 | 7.338710 | 3.922167 | 3.000000 | 4.000000 | 6.125000 | 11.750000 | 15.000000 |
| САД | 62.0 | 110.774194 | 13.216258 | 80.000000 | 102.750000 | 113.500000 | 118.750000 | 150.000000 |
| ДАД | 62.0 | 63.887097 | 12.420376 | 35.000000 | 55.000000 | 63.000000 | 70.000000 | 100.000000 |
| СрАД | 62.0 | 79.516129 | 11.562561 | 50.000000 | 73.083333 | 77.500000 | 85.750000 | 116.666667 |
| ЧСС | 62.0 | 101.145161 | 19.627554 | 60.000000 | 89.000000 | 98.500000 | 118.250000 | 165.000000 |
| ИА | 62.0 | 0.933377 | 0.257408 | 0.500000 | 0.780200 | 0.865385 | 1.065152 | 2.062500 |
| SpO2 | 62.0 | 98.774194 | 2.321809 | 90.000000 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 62.0 | 32.741935 | 22.338627 | 12.000000 | 15.000000 | 21.500000 | 57.500000 | 70.000000 |
| Cl- | 62.0 | 100.972581 | 27.622521 | 0.000000 | 101.175000 | 106.100000 | 110.750000 | 129.000000 |
| Лактат | 62.0 | 0.732258 | 1.322538 | 0.000000 | 0.000000 | 0.000000 | 1.300000 | 7.400000 |
| Амилаза | 62.0 | 43.848387 | 48.114034 | 0.000000 | 0.000000 | 33.000000 | 64.475000 | 186.000000 |
| АЛТ | 62.0 | 59.146774 | 69.878751 | 5.700000 | 18.975000 | 27.200000 | 74.900000 | 370.300000 |
| АСТ | 62.0 | 81.050000 | 87.296940 | 16.800000 | 38.000000 | 52.500000 | 98.300000 | 604.200000 |
| АЧТВ | 62.0 | 27.727419 | 12.050977 | 0.000000 | 26.962500 | 29.200000 | 33.675000 | 45.100000 |
| Инфузия, % от N | 62.0 | 106.657416 | 41.176714 | 16.607595 | 82.251450 | 107.430341 | 131.557349 | 205.625000 |
| КИ | 62.0 | 2.338710 | 6.121565 | 0.000000 | 0.000000 | 0.000000 | 4.375000 | 40.000000 |
| Площадь тела | 62.0 | 1.062903 | 0.245993 | 0.550000 | 0.910000 | 1.090000 | 1.255000 | 1.390000 |
| Диурез, мл/кг | 62.0 | 58.592842 | 37.278234 | 5.000000 | 29.060526 | 51.416667 | 83.333333 | 179.166667 |
df_noGT[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 442.0 | 9.533793 | 5.402981 | 0.250000 | 4.000000 | 11.000000 | 15.000000 | 18.000000 |
| САД | 442.0 | 110.757919 | 15.134701 | 50.000000 | 100.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 442.0 | 64.291855 | 11.203473 | 26.000000 | 60.000000 | 64.500000 | 70.000000 | 119.000000 |
| СрАД | 442.0 | 79.780543 | 11.529464 | 34.000000 | 73.333333 | 80.000000 | 86.666667 | 117.333333 |
| ЧСС | 442.0 | 105.434389 | 23.485828 | 40.000000 | 90.000000 | 107.000000 | 120.000000 | 180.000000 |
| ИА | 442.0 | 0.977722 | 0.290774 | 0.381356 | 0.772942 | 0.989181 | 1.127008 | 2.250000 |
| SpO2 | 442.0 | 98.490950 | 2.585703 | 70.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 442.0 | 40.165158 | 23.323659 | 6.000000 | 16.500000 | 40.000000 | 60.000000 | 103.000000 |
| Cl- | 442.0 | 106.810633 | 27.240048 | 0.000000 | 103.225000 | 108.200000 | 113.925000 | 191.000000 |
| Лактат | 442.0 | 1.301787 | 1.358736 | 0.000000 | 0.000000 | 1.100000 | 1.700000 | 17.000000 |
| Амилаза | 442.0 | 69.267873 | 149.430565 | 0.000000 | 0.000000 | 39.000000 | 78.975000 | 2520.000000 |
| АЛТ | 442.0 | 92.528959 | 172.734534 | 0.000000 | 18.700000 | 35.000000 | 92.750000 | 1384.000000 |
| АСТ | 442.0 | 112.097217 | 229.037349 | 0.000000 | 28.900000 | 52.000000 | 103.175000 | 2242.000000 |
| АЧТВ | 442.0 | 24.614706 | 17.835235 | 0.000000 | 0.000000 | 30.000000 | 37.000000 | 67.000000 |
| Инфузия, % от N | 442.0 | 118.928207 | 49.901537 | 0.000000 | 93.170732 | 112.254684 | 143.658425 | 295.701754 |
| КИ | 442.0 | 6.478394 | 21.513932 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 320.000000 |
| Площадь тела | 442.0 | 0.962680 | 0.344912 | 0.290800 | 0.730000 | 0.970000 | 1.330000 | 1.390000 |
| Диурез, мл/кг | 442.0 | 56.164626 | 34.108535 | 0.000000 | 32.115385 | 48.503497 | 72.727273 | 229.333333 |
# сравнение средних
a = pd.DataFrame(df_only1[target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: ГТ только в 1й день'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df_noGT[df_noGT[i]>0][i].mean())
a['Группа 2: не получает ГТ'] = a_
a
| Группа 1: ГТ только в 1й день | Группа 2: не получает ГТ | |
|---|---|---|
| Возраст | 7.338710 | 9.533793 |
| САД | 110.774194 | 110.757919 |
| ДАД | 63.887097 | 64.291855 |
| СрАД | 79.516129 | 79.780543 |
| ЧСС | 101.145161 | 105.434389 |
| ИА | 0.933377 | 0.977722 |
| SpO2 | 98.774194 | 98.490950 |
| Масса тела | 32.741935 | 40.165158 |
| Cl- | 100.972581 | 111.872749 |
| Лактат | 0.732258 | 1.743606 |
| Амилаза | 43.848387 | 97.194921 |
| АЛТ | 59.146774 | 103.277273 |
| АСТ | 81.050000 | 126.395332 |
| АЧТВ | 27.727419 | 34.429430 |
| Инфузия, % от N | 106.657416 | 120.564834 |
| КИ | 2.338710 | 14.389196 |
| Площадь тела | 1.062903 | 0.962680 |
| Диурез, мл/кг | 58.592842 | 57.332020 |
# Размер выборки
print(f'Количество пациентов в группах:\nПервая группа\t{df_only1.ID.nunique()}\nВторая группа\t{df_noGT.ID.nunique()}')
Количество пациентов в группах: Первая группа 12 Вторая группа 90
sns.barplot(data = [[0],[df_only1.ID.nunique()],[df_noGT.ID.nunique()]])
plt.xlim(0.5)
plt.title('Размер групп');
# for k,i in enumerate(target_columns[3:]):
# print('Параметр =',i,'\nСреднее = ',df_gt_more1day[i].mean(),'std =',df_gt_more1day[i].std(ddof=1))
figure,ax = plt.subplots(len(target_columns[3:-1]),4,figsize=(19,70))
for k,i in enumerate(target_columns[3:-1]):
try:
sns.histplot(df_only1[i],bins=10,ax=ax[k,0])
interval = np.linspace(0,1,int(df_only1[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_only1[i].count())),loc=df_only1[i].mean(),scale=df_only1[i].std(ddof=1))
y = np.quantile(df_only1[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,1],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,1],color='b')
sns.scatterplot(x = np.linspace(0,int(df_only1[i].max()),int(df_only1[i].count())),y = df_only1[i],ax=ax[k,1],color='grey')
sns.histplot(df_noGT[i],bins=10,ax=ax[k,2])
interval = np.linspace(0,1,int(df_noGT[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_noGT[i].count())),loc=df_noGT[i].mean(),scale=df_noGT[i].std(ddof=1))
y = np.quantile(df_noGT[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,3],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,3],color='b')
sns.scatterplot(x = np.linspace(0,int(df_noGT[i].max()),int(df_noGT[i].count())),y = df_noGT[i],ax=ax[k,3],color='grey')
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
except Exception:
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
pass
for k,i in enumerate(target_columns[3:-1]):
group0 = df_only1[i]
group1 = df_noGT[i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Этап 4',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Этап 4',i,'обнаружены значимые различия',p,alpha])
# if alpha<p:
# print(f'Разница по параметру {i} между двумя группами не доказана.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
# else:
# print(f'По параметру {i} наблюдается статистически достоверная разница между двумя группами.')
# print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
результаты представлены в сводной таблице (см. ниже)
df_any_users = df.loc[df.GT==1,'ID'].unique()
df_any = df.loc[df.ID.isin(df_any_users),:]
df_noGT_users = df.groupby('ID',as_index=False).max()
df_noGT_users = df_noGT_users.loc[df_noGT_users.GT==0,'ID']
df_noGT = df.loc[df.ID.isin(df_noGT_users),:]
df_any[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 950.0 | 10.169496 | 5.463123 | 0.250000 | 5.000000 | 12.000000 | 15.000000 | 17.000000 |
| САД | 950.0 | 111.498947 | 15.995175 | 45.000000 | 101.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 950.0 | 65.114737 | 13.107262 | 5.000000 | 56.000000 | 65.000000 | 75.000000 | 110.000000 |
| СрАД | 950.0 | 80.576140 | 13.194491 | 26.333333 | 73.333333 | 80.833333 | 90.000000 | 120.666667 |
| ЧСС | 950.0 | 105.881053 | 23.499379 | 24.000000 | 90.000000 | 105.000000 | 120.000000 | 186.000000 |
| ИА | 950.0 | 0.974400 | 0.296070 | 0.200000 | 0.782609 | 0.926121 | 1.096178 | 3.100000 |
| SpO2 | 950.0 | 98.324211 | 3.627861 | 26.000000 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 950.0 | 40.862105 | 22.366497 | 6.000000 | 20.000000 | 45.000000 | 60.000000 | 100.000000 |
| Cl- | 950.0 | 108.583579 | 43.823697 | 0.000000 | 104.000000 | 109.000000 | 116.000000 | 1102.000000 |
| Лактат | 950.0 | 1.544632 | 1.888258 | -1.100000 | 0.700000 | 1.300000 | 2.000000 | 25.000000 |
| Амилаза | 950.0 | 112.908642 | 173.921494 | 0.000000 | 0.000000 | 61.000000 | 141.500000 | 1940.000000 |
| АЛТ | 950.0 | 77.092779 | 158.850638 | 0.000000 | 23.000000 | 40.350000 | 74.225000 | 2865.000000 |
| АСТ | 950.0 | 102.830789 | 200.358409 | 0.000000 | 31.925000 | 50.600000 | 97.262500 | 2458.300000 |
| АЧТВ | 950.0 | 26.216789 | 17.708873 | 0.000000 | 23.550000 | 30.000000 | 34.387500 | 162.000000 |
| Инфузия, % от N | 950.0 | 125.897526 | 55.098593 | 0.000000 | 95.468750 | 119.125000 | 143.472222 | 647.916667 |
| КИ | 950.0 | 8.891968 | 36.776043 | 0.000000 | 0.000000 | 5.000000 | 7.000000 | 956.600000 |
| Площадь тела | 950.0 | 0.951258 | 0.328448 | 0.250000 | 0.660000 | 1.030000 | 1.210000 | 1.450000 |
| Диурез, мл/кг | 950.0 | 54.746808 | 35.783735 | 0.000000 | 30.000000 | 46.201923 | 70.833333 | 280.000000 |
df_noGT[target_columns[2:]].drop('GT',axis=1).describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 442.0 | 9.533793 | 5.402981 | 0.250000 | 4.000000 | 11.000000 | 15.000000 | 18.000000 |
| САД | 442.0 | 110.757919 | 15.134701 | 50.000000 | 100.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 442.0 | 64.291855 | 11.203473 | 26.000000 | 60.000000 | 64.500000 | 70.000000 | 119.000000 |
| СрАД | 442.0 | 79.780543 | 11.529464 | 34.000000 | 73.333333 | 80.000000 | 86.666667 | 117.333333 |
| ЧСС | 442.0 | 105.434389 | 23.485828 | 40.000000 | 90.000000 | 107.000000 | 120.000000 | 180.000000 |
| ИА | 442.0 | 0.977722 | 0.290774 | 0.381356 | 0.772942 | 0.989181 | 1.127008 | 2.250000 |
| SpO2 | 442.0 | 98.490950 | 2.585703 | 70.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 442.0 | 40.165158 | 23.323659 | 6.000000 | 16.500000 | 40.000000 | 60.000000 | 103.000000 |
| Cl- | 442.0 | 106.810633 | 27.240048 | 0.000000 | 103.225000 | 108.200000 | 113.925000 | 191.000000 |
| Лактат | 442.0 | 1.301787 | 1.358736 | 0.000000 | 0.000000 | 1.100000 | 1.700000 | 17.000000 |
| Амилаза | 442.0 | 69.267873 | 149.430565 | 0.000000 | 0.000000 | 39.000000 | 78.975000 | 2520.000000 |
| АЛТ | 442.0 | 92.528959 | 172.734534 | 0.000000 | 18.700000 | 35.000000 | 92.750000 | 1384.000000 |
| АСТ | 442.0 | 112.097217 | 229.037349 | 0.000000 | 28.900000 | 52.000000 | 103.175000 | 2242.000000 |
| АЧТВ | 442.0 | 24.614706 | 17.835235 | 0.000000 | 0.000000 | 30.000000 | 37.000000 | 67.000000 |
| Инфузия, % от N | 442.0 | 118.928207 | 49.901537 | 0.000000 | 93.170732 | 112.254684 | 143.658425 | 295.701754 |
| КИ | 442.0 | 6.478394 | 21.513932 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 320.000000 |
| Площадь тела | 442.0 | 0.962680 | 0.344912 | 0.290800 | 0.730000 | 0.970000 | 1.330000 | 1.390000 |
| Диурез, мл/кг | 442.0 | 56.164626 | 34.108535 | 0.000000 | 32.115385 | 48.503497 | 72.727273 | 229.333333 |
# сравнение средних
a = pd.DataFrame(df_any[target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: получает ГТ'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df_noGT[df_noGT[i]>0][i].mean())
a['Группа 2: не получает ГТ'] = a_
a
| Группа 1: получает ГТ | Группа 2: не получает ГТ | |
|---|---|---|
| Возраст | 10.169496 | 9.533793 |
| САД | 111.498947 | 110.757919 |
| ДАД | 65.114737 | 64.291855 |
| СрАД | 80.576140 | 79.780543 |
| ЧСС | 105.881053 | 105.434389 |
| ИА | 0.974400 | 0.977722 |
| SpO2 | 98.324211 | 98.490950 |
| Масса тела | 40.862105 | 40.165158 |
| Cl- | 108.583579 | 111.872749 |
| Лактат | 1.544632 | 1.743606 |
| Амилаза | 112.908642 | 97.194921 |
| АЛТ | 77.092779 | 103.277273 |
| АСТ | 102.830789 | 126.395332 |
| АЧТВ | 26.216789 | 34.429430 |
| Инфузия, % от N | 125.897526 | 120.564834 |
| КИ | 8.891968 | 14.389196 |
| Площадь тела | 0.951258 | 0.962680 |
| Диурез, мл/кг | 54.746808 | 57.332020 |
# Размер выборки
print(f'Количество пациентов в группах:\nПервая группа\t{df_any.ID.nunique()}\nВторая группа\t{df_noGT.ID.nunique()}')
Количество пациентов в группах: Первая группа 113 Вторая группа 90
sns.barplot(data = [[0],[df_any.ID.nunique()],[df_noGT.ID.nunique()]])
plt.xlim(0.5)
plt.title('Размер групп');
# for k,i in enumerate(target_columns[3:]):
# print('Параметр =',i,'\nСреднее = ',df_gt_more1day[i].mean(),'std =',df_gt_more1day[i].std(ddof=1))
figure,ax = plt.subplots(len(target_columns[3:-1]),4,figsize=(19,70))
for k,i in enumerate(target_columns[3:-1]):
try:
sns.histplot(df_any[i],bins=10,ax=ax[k,0])
interval = np.linspace(0,1,int(df_any[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_any[i].count())),loc=df_any[i].mean(),scale=df_any[i].std(ddof=1))
y = np.quantile(df_any[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,1],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,1],color='b')
sns.scatterplot(x = np.linspace(0,int(df_any[i].max()),int(df_any[i].count())),y = df_any[i],ax=ax[k,1],color='grey')
sns.histplot(df_noGT[i],bins=10,ax=ax[k,2])
interval = np.linspace(0,1,int(df_noGT[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(df_noGT[i].count())),loc=df_noGT[i].mean(),scale=df_noGT[i].std(ddof=1))
y = np.quantile(df_noGT[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,3],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,3],color='b')
sns.scatterplot(x = np.linspace(0,int(df_noGT[i].max()),int(df_noGT[i].count())),y = df_noGT[i],ax=ax[k,3],color='grey')
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
except Exception:
ax[k,0].set_title(i+' (получали ГТ)')
ax[k,1].set_title(i+' (получали ГТ: QQ-plot)')
ax[k,2].set_title(i+' (не получали ГТ)')
ax[k,3].set_title(i+' (не получали ГТ: QQ-plot)')
plt.tight_layout()
pass
for k,i in enumerate(target_columns[3:-1]):
group0 = df_any[i]
group1 = df_noGT[i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Этап 5',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Этап 5',i,'обнаружены значимые различия',p,alpha])
if alpha<p:
print(f'Разница по параметру {i} между двумя группами не доказана.')
print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
else:
print(f'По параметру {i} наблюдается статистически достоверная разница между двумя группами.')
print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
По параметру GT наблюдается статистически достоверная разница между двумя группами. Статистика теста = 308.14877267399817, p-значение = 5.527209682796086e-69 Разница по параметру САД между двумя группами не доказана. Статистика теста = 0.789104211346105, p-значение = 0.3743711298061947 Разница по параметру ДАД между двумя группами не доказана. Статистика теста = 2.7054287237733887, p-значение = 0.10000719410523369 Разница по параметру СрАД между двумя группами не доказана. Статистика теста = 3.0993025343491, p-значение = 0.07832584439605056 Разница по параметру ЧСС между двумя группами не доказана. Статистика теста = 0.11643911886382965, p-значение = 0.7329291102177846 Разница по параметру ИА между двумя группами не доказана. Статистика теста = 1.6827012673646609, p-значение = 0.1945659039824976 Разница по параметру SpO2 между двумя группами не доказана. Статистика теста = 1.4013909315768618, p-значение = 0.23649082215979317 Разница по параметру Масса тела между двумя группами не доказана. Статистика теста = 0.5132014739655003, p-значение = 0.4737562370529689 Разница по параметру Cl- между двумя группами не доказана. Статистика теста = 1.9764596362236475, p-значение = 0.15976387408359172 По параметру Лактат наблюдается статистически достоверная разница между двумя группами. Статистика теста = 4.345382051745382, p-значение = 0.03710944035028754 По параметру Амилаза наблюдается статистически достоверная разница между двумя группами. Статистика теста = 23.36307258502768, p-значение = 1.3412884804072379e-06 Разница по параметру АЛТ между двумя группами не доказана. Статистика теста = 1.0558792745562107, p-значение = 0.3041569120249382 Разница по параметру АСТ между двумя группами не доказана. Статистика теста = 0.2507335853078321, p-значение = 0.6165590105483493 Разница по параметру АЧТВ между двумя группами не доказана. Статистика теста = 0.31955488822393074, p-значение = 0.5718752636675102 Разница по параметру Инфузия, % от N между двумя группами не доказана. Статистика теста = 3.2274101479296515, p-значение = 0.07241512567509965 По параметру КИ наблюдается статистически достоверная разница между двумя группами. Статистика теста = 44.58962956570288, p-значение = 2.4297524397228827e-11 Разница по параметру Площадь тела между двумя группами не доказана. Статистика теста = 1.1527486425364868, p-значение = 0.28297450085997505 Разница по параметру Диурез, мл/кг между двумя группами не доказана. Статистика теста = 2.2854119663953787, p-значение = 0.1305954615441217
group0 = df_any['КИ'].drop(df_any.loc[df_any['КИ']>800,:].index,axis=0)
group1 = df_noGT['КИ']
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
print(f'Разница по параметру КИ между двумя группами не доказана.')
print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
else:
print(f'По параметру КИ наблюдается статистически достоверная разница между двумя группами.')
print(f'\tСтатистика теста = {test_value}, p-значение = {p}')
По параметру КИ наблюдается статистически достоверная разница между двумя группами. Статистика теста = 44.23698594591091, p-значение = 2.909321225967024e-11
def highlight_greaterthan(x):
color = 'lightgreen' if x<0.05 else 'white'
return 'background-color: %s' % color
df_results = pd.DataFrame(append_list)
df_results.columns = columns
df_results = df_results.drop(['Значимость различий','alpha'], axis=1).pivot(columns = 'Вариант',index = 'Показатель',values = 'p_value').drop('GT',axis=0)
df_results = df_results.style.applymap(highlight_greaterthan)
df_results
| Вариант | Этап 1 | Этап 2 | Этап 3 | Этап 4 | Этап 5 |
|---|---|---|---|---|---|
| Показатель | |||||
| Cl- | 0.457506 | 0.097884 | 0.000003 | 0.033847 | 0.159764 |
| SpO2 | 0.752932 | 0.487279 | 0.628304 | 0.909820 | 0.236491 |
| АЛТ | 0.975858 | 0.058156 | 0.179017 | 0.490306 | 0.304157 |
| АСТ | 0.505087 | 0.796281 | 0.045298 | 0.460869 | 0.616559 |
| АЧТВ | 0.437916 | 0.046088 | 0.010146 | 0.885253 | 0.571875 |
| Амилаза | 0.172694 | 0.021492 | 0.000000 | 0.198576 | 0.000001 |
| ДАД | 0.291620 | 0.124629 | 0.421296 | 0.500656 | 0.100007 |
| Диурез, мл/кг | 0.423433 | 0.047508 | 0.137048 | 0.900328 | 0.130595 |
| ИА | 0.413728 | 0.506601 | 0.086575 | 0.155302 | 0.194566 |
| Инфузия, % от N | 0.987496 | 0.141550 | 0.000001 | 0.084855 | 0.072415 |
| КИ | 0.142119 | 0.000000 | 0.000000 | 0.017552 | 0.000000 |
| Лактат | 0.539150 | 0.000000 | 0.000000 | 0.000005 | 0.037109 |
| Масса тела | 0.950929 | 0.001957 | 0.134864 | 0.039056 | 0.473756 |
| Площадь тела | 0.222210 | 0.395471 | 0.000001 | 0.099701 | 0.282975 |
| САД | 0.735154 | 0.320013 | 0.954688 | 0.879427 | 0.374371 |
| СрАД | 0.469319 | 0.135631 | 0.641475 | 0.677084 | 0.078326 |
| ЧСС | 0.562531 | 0.191232 | 0.035325 | 0.086939 | 0.732929 |
group0 = df[df['OUTCOME']=='Survived']
group1 = df[df['OUTCOME']=='Died']
figure,ax = plt.subplots(len(target_columns[2:-1]),4,figsize=(19,75))
for k,i in enumerate(target_columns[2:-1]):
try:
sns.histplot(group0[i],bins=10,ax=ax[k,0])
interval = np.linspace(0,1,int(group0[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(group0[i].count())),loc=group0[i].mean(),scale=group0[i].std(ddof=1))
y = np.quantile(group0[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,1],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,1],color='b')
sns.scatterplot(x = np.linspace(0,int(group0[i].max()),int(group0[i].count())),y = group0[i],ax=ax[k,1],color='grey')
sns.histplot(group1[i],bins=10,ax=ax[k,2])
interval = np.linspace(0,1,int(group1[i].count()))
x = stats.norm.ppf(np.linspace(0,1,int(group1[i].count())),loc=group1[i].mean(),scale=group1[i].std(ddof=1))
y = np.quantile(group1[i],interval)
sns.lineplot(x = x,y = x,ax=ax[k,3],color='r')
sns.lineplot(x = x,y = y,ax=ax[k,3],color='b')
sns.scatterplot(x = np.linspace(0,int(group1[i].max()),int(group1[i].count())),y = group1[i],ax=ax[k,3],color='grey')
ax[k,0].set_title(i+' (выжившие пациенты)')
ax[k,1].set_title(i+' (выжившие пациенты: QQ-plot)')
ax[k,2].set_title(i+' (умершие пациенты)')
ax[k,3].set_title(i+' (умершие пациенты: QQ-plot)')
plt.tight_layout()
except Exception:
ax[k,0].set_title(i+' (выжившие пациенты)')
ax[k,1].set_title(i+' (выжившие пациенты: QQ-plot)')
ax[k,2].set_title(i+' (умершие пациенты)')
ax[k,3].set_title(i+' (умершие пациенты: QQ-plot)')
plt.tight_layout()
pass
Все вместе:
df.groupby('OUTCOME',as_index=False)['ID'].nunique().replace({'Died':'Умерли','Survived':'Выжили'})
| OUTCOME | ID | |
|---|---|---|
| 0 | Умерли | 19 |
| 1 | Выжили | 184 |
Имеется сильная асимметрия выборки: большинство пациентов выжили; 19 - умерли.
# количество умерших (Died) и выживших (Survived) пациентов
fig, ax = plt.subplots()
sns.barplot(data = [[i] for i in df.groupby('OUTCOME',as_index=False)['ID'].nunique()['ID']])
ax.set_xticklabels(['Умерли', 'Выжили'])
plt.show()
Описательная статистика: Выжившие пациенты
# описательная статистика выживших пациентов
df[df['OUTCOME']=='Survived'][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 1232.0 | 10.154795 | 5.538551 | 0.25 | 4.000000 | 12.000000 | 15.000000 | 18.000000 |
| GT | 1232.0 | 0.293831 | 0.455701 | 0.00 | 0.000000 | 0.000000 | 1.000000 | 1.000000 |
| САД | 1232.0 | 112.331981 | 14.082478 | 50.00 | 104.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 1232.0 | 65.692370 | 11.614174 | 5.00 | 60.000000 | 65.000000 | 73.000000 | 119.000000 |
| СрАД | 1232.0 | 81.238907 | 11.469878 | 30.00 | 73.333333 | 81.333333 | 88.333333 | 117.666667 |
| ЧСС | 1232.0 | 105.797890 | 23.279370 | 24.00 | 90.000000 | 106.000000 | 120.000000 | 180.000000 |
| ИА | 1232.0 | 0.962915 | 0.278175 | 0.20 | 0.772727 | 0.933333 | 1.100000 | 2.800000 |
| SpO2 | 1232.0 | 98.581169 | 2.996055 | 26.00 | 98.000000 | 99.000000 | 100.000000 | 110.000000 |
| Масса тела | 1232.0 | 41.689123 | 23.182670 | 6.00 | 18.000000 | 45.000000 | 60.000000 | 103.000000 |
| Cl- | 1232.0 | 108.456494 | 38.399841 | 0.00 | 103.875000 | 108.000000 | 114.000000 | 1102.000000 |
| Лактат | 1232.0 | 1.374789 | 1.310977 | -1.10 | 0.800000 | 1.200000 | 1.800000 | 25.000000 |
| Амилаза | 1232.0 | 108.360438 | 172.023681 | 0.00 | 19.662500 | 61.000000 | 129.775000 | 2520.000000 |
| АЛТ | 1232.0 | 77.758352 | 147.442066 | 0.00 | 20.500000 | 36.750000 | 71.100000 | 1885.200000 |
| АСТ | 1232.0 | 97.160081 | 198.807334 | 0.00 | 30.000000 | 48.300000 | 83.387500 | 2242.000000 |
| АЧТВ | 1232.0 | 26.167654 | 15.476217 | 0.00 | 24.000000 | 30.000000 | 35.000000 | 125.000000 |
| Инфузия, % от N | 1232.0 | 123.529011 | 54.246247 | 0.00 | 95.026596 | 116.583333 | 142.742529 | 647.916667 |
| КИ | 1232.0 | 5.558620 | 14.590389 | 0.00 | 0.000000 | 2.500000 | 5.000000 | 199.200000 |
| Площадь тела | 1232.0 | 0.952451 | 0.331919 | 0.25 | 0.670000 | 1.030000 | 1.270000 | 1.390000 |
| Диурез, мл/кг | 1232.0 | 55.327892 | 35.223939 | 0.00 | 30.595631 | 46.733333 | 72.500000 | 280.000000 |
Описательная статистика: Умершие пациенты
# описательная статистика умерших пациентов
df[df['OUTCOME']=='Died'][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 160.0 | 8.526563 | 4.473692 | 0.250000 | 5.250000 | 9.000000 | 13.000000 | 17.000000 |
| GT | 160.0 | 0.543750 | 0.499646 | 0.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 160.0 | 103.037500 | 23.474565 | 45.000000 | 86.500000 | 103.000000 | 117.000000 | 165.000000 |
| ДАД | 160.0 | 58.393750 | 16.823949 | 17.000000 | 46.750000 | 59.500000 | 70.000000 | 99.000000 |
| СрАД | 160.0 | 73.275000 | 18.274426 | 26.333333 | 60.000000 | 73.333333 | 86.833333 | 120.666667 |
| ЧСС | 160.0 | 105.287500 | 25.105410 | 41.000000 | 90.000000 | 106.000000 | 121.250000 | 186.000000 |
| ИА | 160.0 | 1.072014 | 0.384730 | 0.464000 | 0.838539 | 0.990990 | 1.191877 | 3.100000 |
| SpO2 | 160.0 | 96.806250 | 4.984879 | 69.000000 | 98.000000 | 98.000000 | 99.000000 | 100.000000 |
| Масса тела | 160.0 | 32.568750 | 16.142300 | 6.000000 | 20.000000 | 30.000000 | 43.000000 | 75.000000 |
| Cl- | 160.0 | 104.664375 | 45.801353 | 0.000000 | 103.125000 | 114.500000 | 133.250000 | 193.000000 |
| Лактат | 160.0 | 2.181563 | 3.553529 | 0.000000 | 0.000000 | 1.100000 | 2.800000 | 20.000000 |
| Амилаза | 160.0 | 27.372188 | 105.539960 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 892.000000 |
| АЛТ | 160.0 | 114.610313 | 253.571733 | 0.000000 | 39.375000 | 71.000000 | 113.000000 | 2865.000000 |
| АСТ | 160.0 | 172.093750 | 272.496902 | 0.000000 | 42.100000 | 111.000000 | 183.000000 | 2458.300000 |
| АЧТВ | 160.0 | 22.169375 | 29.838148 | 0.000000 | 0.000000 | 24.000000 | 38.000000 | 162.000000 |
| Инфузия, % от N | 160.0 | 124.882344 | 48.315790 | 0.000000 | 93.714326 | 125.884109 | 147.916667 | 300.176471 |
| КИ | 160.0 | 27.891250 | 85.292433 | 0.000000 | 5.000000 | 8.000000 | 20.000000 | 956.600000 |
| Площадь тела | 160.0 | 0.973625 | 0.347461 | 0.410000 | 0.730000 | 0.970000 | 1.285000 | 1.450000 |
| Диурез, мл/кг | 160.0 | 54.189184 | 35.582893 | 0.000000 | 32.750000 | 45.684524 | 70.857558 | 179.500000 |
# сравнение средних
a = pd.DataFrame(df[df['OUTCOME']=='Died'][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df[df['OUTCOME']=='Survived'][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 8.526563 | 10.154795 |
| САД | 103.037500 | 112.331981 |
| ДАД | 58.393750 | 65.692370 |
| СрАД | 73.275000 | 81.238907 |
| ЧСС | 105.287500 | 105.797890 |
| ИА | 1.072014 | 0.962915 |
| SpO2 | 96.806250 | 98.581169 |
| Масса тела | 32.568750 | 41.689123 |
| Cl- | 104.664375 | 108.456494 |
| Лактат | 2.181563 | 1.374789 |
| Амилаза | 27.372188 | 108.360438 |
| АЛТ | 114.610313 | 77.758352 |
| АСТ | 172.093750 | 97.160081 |
| АЧТВ | 22.169375 | 26.167654 |
| Инфузия, % от N | 124.882344 | 123.529011 |
| КИ | 27.891250 | 5.558620 |
| Площадь тела | 0.973625 | 0.952451 |
| Диурез, мл/кг | 54.189184 | 55.327892 |
Проверка наличия значимой разницы между группами выживших и умерших пациентов
# для сохранения результатов в виде таблицы
columns = ['Вариант','Показатель','Значимость различий','p_value','alpha']
append_list = []
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное (графики ниже), воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[df['OUTCOME']=='Survived'][i]
group1 = df[df['OUTCOME']=='Died'][i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Все пациенты',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Все пациенты',i,'обнаружены значимые различия',p,alpha])
a = df[df['GT']==1].groupby('OUTCOME',as_index=False)['ID'].nunique().replace({'Died':'Умерли','Survived':'Выжили'})
a.columns=['Исход','Количество пациентов']
a
| Исход | Количество пациентов | |
|---|---|---|
| 0 | Умерли | 14 |
| 1 | Выжили | 99 |
# Группа 1: умерли
df[(df['OUTCOME']=='Died')&(df['GT']==1)][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 87.0 | 7.028736 | 3.970190 | 0.250000 | 4.833333 | 6.666667 | 9.000000 | 17.000000 |
| GT | 87.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 87.0 | 99.160920 | 21.265691 | 45.000000 | 82.500000 | 102.000000 | 114.000000 | 165.000000 |
| ДАД | 87.0 | 57.034483 | 16.770994 | 17.000000 | 45.000000 | 58.000000 | 70.000000 | 93.000000 |
| СрАД | 87.0 | 71.076628 | 17.668692 | 26.333333 | 59.666667 | 71.666667 | 84.833333 | 115.000000 |
| ЧСС | 87.0 | 104.321839 | 28.342381 | 41.000000 | 87.000000 | 107.000000 | 121.500000 | 186.000000 |
| ИА | 87.0 | 1.095675 | 0.420074 | 0.464000 | 0.858396 | 1.000000 | 1.192099 | 3.100000 |
| SpO2 | 87.0 | 97.091954 | 4.105108 | 70.000000 | 97.500000 | 98.000000 | 99.000000 | 100.000000 |
| Масса тела | 87.0 | 27.137931 | 13.913497 | 6.000000 | 20.000000 | 25.000000 | 30.000000 | 75.000000 |
| Cl- | 87.0 | 109.483908 | 45.386889 | 0.000000 | 103.500000 | 120.000000 | 139.000000 | 193.000000 |
| Лактат | 87.0 | 2.839655 | 4.198028 | 0.000000 | 0.000000 | 1.200000 | 4.100000 | 20.000000 |
| Амилаза | 87.0 | 29.551724 | 118.743495 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 892.000000 |
| АЛТ | 87.0 | 152.105747 | 334.063887 | 0.000000 | 45.000000 | 71.000000 | 113.000000 | 2865.000000 |
| АСТ | 87.0 | 221.151724 | 335.945268 | 0.000000 | 92.400000 | 138.500000 | 183.000000 | 2458.300000 |
| АЧТВ | 87.0 | 18.912644 | 24.300827 | 0.000000 | 0.000000 | 0.000000 | 36.500000 | 120.000000 |
| Инфузия, % от N | 87.0 | 124.278304 | 52.851206 | 11.952941 | 88.852877 | 109.294118 | 157.852930 | 300.176471 |
| КИ | 87.0 | 31.955172 | 109.587214 | 0.000000 | 5.000000 | 7.500000 | 18.000000 | 956.600000 |
| Площадь тела | 87.0 | 1.038966 | 0.323049 | 0.430000 | 0.970000 | 1.090000 | 1.330000 | 1.450000 |
| Диурез, мл/кг | 87.0 | 59.325500 | 38.658511 | 0.000000 | 35.916667 | 50.000000 | 77.083333 | 179.500000 |
# Группа 2: выжили
df[(df['OUTCOME']=='Survived')&(df['GT']==1)][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 362.0 | 9.588113 | 5.599449 | 0.666667 | 4.000000 | 11.000000 | 14.000000 | 17.000000 |
| GT | 362.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 362.0 | 110.812155 | 15.094827 | 50.000000 | 100.000000 | 110.000000 | 120.000000 | 163.000000 |
| ДАД | 362.0 | 63.944751 | 12.661248 | 20.000000 | 55.000000 | 64.000000 | 70.000000 | 100.000000 |
| СрАД | 362.0 | 79.567219 | 12.645701 | 30.000000 | 71.416667 | 79.333333 | 87.333333 | 117.666667 |
| ЧСС | 362.0 | 106.569061 | 24.055843 | 52.000000 | 90.000000 | 106.000000 | 120.000000 | 176.000000 |
| ИА | 362.0 | 0.991421 | 0.320478 | 0.412903 | 0.782143 | 0.936364 | 1.116447 | 2.800000 |
| SpO2 | 362.0 | 98.345304 | 4.565266 | 26.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 362.0 | 39.592541 | 23.571319 | 7.500000 | 17.000000 | 35.000000 | 60.000000 | 100.000000 |
| Cl- | 362.0 | 108.098066 | 63.417005 | 0.000000 | 104.000000 | 109.000000 | 115.000000 | 1102.000000 |
| Лактат | 362.0 | 1.633287 | 1.346455 | 0.000000 | 0.900000 | 1.400000 | 2.337500 | 9.000000 |
| Амилаза | 362.0 | 137.386436 | 234.684048 | 0.000000 | 0.000000 | 55.450000 | 156.125000 | 1940.000000 |
| АЛТ | 362.0 | 85.976547 | 167.227641 | 0.000000 | 20.000000 | 39.200000 | 85.887500 | 1885.200000 |
| АСТ | 362.0 | 120.489365 | 227.273124 | 0.000000 | 32.487500 | 55.000000 | 116.000000 | 1958.500000 |
| АЧТВ | 362.0 | 22.750414 | 15.995155 | 0.000000 | 0.000000 | 28.000000 | 33.000000 | 90.000000 |
| Инфузия, % от N | 362.0 | 119.647799 | 64.654637 | 0.000000 | 81.581605 | 108.125000 | 139.705882 | 564.146341 |
| КИ | 362.0 | 7.214696 | 19.695994 | 0.000000 | 0.000000 | 2.800000 | 5.000000 | 199.200000 |
| Площадь тела | 362.0 | 0.924641 | 0.320415 | 0.250000 | 0.610000 | 1.030000 | 1.210000 | 1.390000 |
| Диурез, мл/кг | 362.0 | 54.808690 | 38.617765 | 1.571429 | 29.244505 | 46.619048 | 70.743590 | 280.000000 |
# сравнение средних
a = pd.DataFrame(df[(df['OUTCOME']=='Died')&(df['GT']==1)][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df[(df['OUTCOME']=='Survived')&(df['GT']==1)][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 7.028736 | 9.588113 |
| САД | 99.160920 | 110.812155 |
| ДАД | 57.034483 | 63.944751 |
| СрАД | 71.076628 | 79.567219 |
| ЧСС | 104.321839 | 106.569061 |
| ИА | 1.095675 | 0.991421 |
| SpO2 | 97.091954 | 98.345304 |
| Масса тела | 27.137931 | 39.592541 |
| Cl- | 109.483908 | 108.098066 |
| Лактат | 2.839655 | 1.633287 |
| Амилаза | 29.551724 | 137.386436 |
| АЛТ | 152.105747 | 85.976547 |
| АСТ | 221.151724 | 120.489365 |
| АЧТВ | 18.912644 | 22.750414 |
| Инфузия, % от N | 124.278304 | 119.647799 |
| КИ | 31.955172 | 7.214696 |
| Площадь тела | 1.038966 | 0.924641 |
| Диурез, мл/кг | 59.325500 | 54.808690 |
# количество умерших (0) и выживших (1) пациентов, получавших ГТ
fig, ax = plt.subplots()
sns.barplot(data = [[i] for i in df[df['GT']==1].groupby('ID')['OUTCOME'].first().value_counts()[::-1]]);
ax.set_xticklabels(['Умерли', 'Выжили'])
plt.show()
Проверка наличия значимой разницы между группами выживших и умерших пациентов, получавших ГТ
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное (графики ниже), воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[(df['OUTCOME']=='Survived')&(df['GT']==1)][i]
group1 = df[(df['OUTCOME']=='Died')&(df['GT']==1)][i]
alpha = 0.05
try:
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Получали ГТ',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Получали ГТ',i,'обнаружены значимые различия',p,alpha])
except Exception:
pass
gt_users = df.loc[df['GT']==1,'ID'].unique()
a = df[(df['GT']==0)&(~df.ID.isin(gt_users))].groupby('OUTCOME',as_index=False)['ID'].nunique().replace({'Died':'Умерли','Survived':'Выжили'})
a.columns=['Исход','Количество пациентов']
a
| Исход | Количество пациентов | |
|---|---|---|
| 0 | Умерли | 5 |
| 1 | Выжили | 85 |
# количество умерших (0) и выживших (1) пациентов, не получавших ГТ
fig, ax = plt.subplots()
sns.barplot(data = [[i] for i in df[(df['GT']==0)&(~df.ID.isin(gt_users))].groupby('ID')['OUTCOME'].first().value_counts()[::-1]]);
ax.set_xticklabels(['Умерли', 'Выжили'])
plt.show()
# Группа 1: умерли
df[(df['OUTCOME']=='Died')&(df['GT']==0)&(~df.ID.isin(gt_users))][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 28.0 | 10.000000 | 5.429685 | 1.000000 | 9.250000 | 12.000000 | 13.000000 | 17.000000 |
| GT | 28.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| САД | 28.0 | 98.035714 | 22.280172 | 50.000000 | 85.000000 | 93.000000 | 111.500000 | 142.000000 |
| ДАД | 28.0 | 55.250000 | 16.249501 | 26.000000 | 44.500000 | 52.000000 | 62.000000 | 96.000000 |
| СрАД | 28.0 | 69.511905 | 17.695058 | 34.000000 | 58.000000 | 66.666667 | 77.666667 | 110.666667 |
| ЧСС | 28.0 | 115.964286 | 22.701741 | 64.000000 | 101.500000 | 117.000000 | 125.750000 | 178.000000 |
| ИА | 28.0 | 1.236859 | 0.355690 | 0.731707 | 0.981818 | 1.183473 | 1.361928 | 2.200000 |
| SpO2 | 28.0 | 97.071429 | 5.401842 | 75.000000 | 98.000000 | 99.000000 | 99.250000 | 100.000000 |
| Масса тела | 28.0 | 40.000000 | 17.747196 | 12.000000 | 33.000000 | 40.000000 | 56.000000 | 56.000000 |
| Cl- | 28.0 | 101.810714 | 49.739293 | 0.000000 | 108.000000 | 116.000000 | 132.000000 | 141.000000 |
| Лактат | 28.0 | 1.942857 | 3.307839 | 0.000000 | 0.000000 | 1.500000 | 2.725000 | 17.000000 |
| Амилаза | 28.0 | 43.341071 | 85.142133 | 0.000000 | 0.000000 | 0.000000 | 64.100000 | 389.800000 |
| АЛТ | 28.0 | 72.041071 | 52.059606 | 15.900000 | 22.375000 | 71.000000 | 95.000000 | 232.800000 |
| АСТ | 28.0 | 126.407143 | 154.724158 | 0.000000 | 31.650000 | 85.000000 | 189.000000 | 798.600000 |
| АЧТВ | 28.0 | 26.885714 | 19.680461 | 0.000000 | 0.000000 | 29.000000 | 40.800000 | 58.000000 |
| Инфузия, % от N | 28.0 | 123.284226 | 53.830825 | 0.000000 | 94.312500 | 137.041667 | 160.208333 | 190.833333 |
| КИ | 28.0 | 31.714286 | 59.371309 | 0.000000 | 10.000000 | 14.000000 | 30.000000 | 320.000000 |
| Площадь тела | 28.0 | 0.703571 | 0.188566 | 0.410000 | 0.560000 | 0.730000 | 0.850000 | 1.030000 |
| Диурез, мл/кг | 28.0 | 49.397534 | 36.884901 | 0.000000 | 28.928571 | 42.928571 | 64.020833 | 140.000000 |
# Группа 2: выжили
df[(df['OUTCOME']=='Survived')&(df['GT']==0)&(~df.ID.isin(gt_users))][target_columns[2:-1]].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Возраст | 414.0 | 9.502262 | 5.406316 | 0.250000 | 4.000000 | 11.000000 | 15.000000 | 18.000000 |
| GT | 414.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| САД | 414.0 | 111.618357 | 14.156998 | 70.000000 | 102.000000 | 110.000000 | 120.000000 | 170.000000 |
| ДАД | 414.0 | 64.903382 | 10.528427 | 30.000000 | 60.000000 | 65.000000 | 70.000000 | 119.000000 |
| СрАД | 414.0 | 80.475040 | 10.669506 | 43.333333 | 73.333333 | 80.000000 | 86.666667 | 117.333333 |
| ЧСС | 414.0 | 104.722222 | 23.393624 | 40.000000 | 90.000000 | 105.000000 | 120.000000 | 180.000000 |
| ИА | 414.0 | 0.960196 | 0.277759 | 0.381356 | 0.765913 | 0.973903 | 1.110561 | 2.250000 |
| SpO2 | 414.0 | 98.586957 | 2.255136 | 70.000000 | 98.000000 | 99.000000 | 100.000000 | 100.000000 |
| Масса тела | 414.0 | 40.176329 | 23.670259 | 6.000000 | 16.500000 | 37.000000 | 60.000000 | 103.000000 |
| Cl- | 414.0 | 107.148792 | 25.075463 | 0.000000 | 103.200000 | 108.000000 | 113.000000 | 191.000000 |
| Лактат | 414.0 | 1.258430 | 1.107364 | 0.000000 | 0.525000 | 1.100000 | 1.700000 | 7.800000 |
| Амилаза | 414.0 | 71.021377 | 152.711444 | 0.000000 | 0.000000 | 40.000000 | 79.850000 | 2520.000000 |
| АЛТ | 414.0 | 93.914614 | 177.911547 | 0.000000 | 18.450000 | 34.750000 | 90.975000 | 1384.000000 |
| АСТ | 414.0 | 111.129396 | 233.312475 | 0.000000 | 28.900000 | 50.900000 | 91.975000 | 2242.000000 |
| АЧТВ | 414.0 | 24.461111 | 17.719111 | 0.000000 | 0.000000 | 30.000000 | 36.775000 | 67.000000 |
| Инфузия, % от N | 414.0 | 118.633597 | 49.680709 | 0.000000 | 92.823933 | 111.458333 | 140.364583 | 295.701754 |
| КИ | 414.0 | 4.771618 | 14.754241 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 150.000000 |
| Площадь тела | 414.0 | 0.980204 | 0.346188 | 0.290800 | 0.730000 | 1.090000 | 1.330000 | 1.390000 |
| Диурез, мл/кг | 414.0 | 56.622304 | 33.911779 | 0.000000 | 32.115385 | 48.944444 | 72.727273 | 229.333333 |
# сравнение средних
a = pd.DataFrame(df[(df['OUTCOME']=='Died')&(df['GT']==0)&(~df.ID.isin(gt_users))][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(df[(df['OUTCOME']=='Survived')&(df['GT']==0)&(~df.ID.isin(gt_users))][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 10.000000 | 9.502262 |
| САД | 98.035714 | 111.618357 |
| ДАД | 55.250000 | 64.903382 |
| СрАД | 69.511905 | 80.475040 |
| ЧСС | 115.964286 | 104.722222 |
| ИА | 1.236859 | 0.960196 |
| SpO2 | 97.071429 | 98.586957 |
| Масса тела | 40.000000 | 40.176329 |
| Cl- | 101.810714 | 107.148792 |
| Лактат | 1.942857 | 1.258430 |
| Амилаза | 43.341071 | 71.021377 |
| АЛТ | 72.041071 | 93.914614 |
| АСТ | 126.407143 | 111.129396 |
| АЧТВ | 26.885714 | 24.461111 |
| Инфузия, % от N | 123.284226 | 118.633597 |
| КИ | 31.714286 | 4.771618 |
| Площадь тела | 0.703571 | 0.980204 |
| Диурез, мл/кг | 49.397534 | 56.622304 |
Проверка наличия значимой разницы между группами выживших и умерших пациентов, неполучавших ГТ
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное, воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[(df['OUTCOME']=='Survived')&(df['GT']==0)][i]
group1 = df[(df['OUTCOME']=='Died')&(df['GT']==0)][i]
alpha = 0.05
try:
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Не получали ГТ',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Не получали ГТ',i,'обнаружены значимые различия',p,alpha])
except Exception:
pass
1
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное, воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[(df['OUTCOME']=='Survived')&(df.Day==1)][i]
group1 = df[(df['OUTCOME']=='Died')&(df.Day==1)][i]
alpha = 0.05
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Все пациенты, 1й день',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Все пациенты, 1й день',i,'обнаружены значимые различия',p,alpha])
print(f'Выживших: {group0.shape[0]}, умерших: {group1.shape[0]}')
Выживших: 184, умерших: 19
a0 = df[(df['OUTCOME']=='Survived')&(df.Day==1)]
df[(df['OUTCOME']=='Survived')&(df.Day==1)].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 184.0 | 105.146739 | 63.918025 | 1.000000 | 47.750000 | 107.500000 | 157.500000 | 216.000000 |
| Day | 184.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 184.0 | 8.988207 | 5.359763 | 0.250000 | 4.000000 | 8.500000 | 14.000000 | 18.000000 |
| GT | 184.0 | 0.407609 | 0.492730 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 1.000000 |
| САД | 184.0 | 107.000000 | 18.267592 | 50.000000 | 94.750000 | 110.000000 | 120.000000 | 159.000000 |
| ДАД | 184.0 | 63.179348 | 13.639600 | 20.000000 | 55.000000 | 60.000000 | 70.000000 | 119.000000 |
| СрАД | 184.0 | 77.786232 | 14.272743 | 30.000000 | 69.083333 | 78.000000 | 86.666667 | 117.333333 |
| ЧСС | 184.0 | 110.809783 | 22.699551 | 40.000000 | 94.000000 | 110.000000 | 124.000000 | 172.000000 |
| ИА | 184.0 | 1.081798 | 0.365621 | 0.407692 | 0.828591 | 1.038462 | 1.224465 | 2.800000 |
| SpO2 | 184.0 | 98.173913 | 6.102241 | 26.000000 | 98.000000 | 100.000000 | 100.000000 | 100.000000 |
| Масса тела | 184.0 | 36.005435 | 22.024266 | 6.000000 | 16.750000 | 30.000000 | 51.000000 | 103.000000 |
| Cl- | 184.0 | 93.267391 | 40.597020 | 0.000000 | 100.900000 | 106.000000 | 111.000000 | 200.400000 |
| Лактат | 184.0 | 1.627717 | 2.413995 | 0.000000 | 0.000000 | 1.100000 | 2.600000 | 25.000000 |
| Амилаза | 184.0 | 36.880978 | 65.499462 | 0.000000 | 0.000000 | 13.800000 | 49.000000 | 533.500000 |
| АЛТ | 184.0 | 115.638859 | 246.634132 | 0.000000 | 13.300000 | 30.000000 | 95.275000 | 1885.200000 |
| АСТ | 184.0 | 172.759076 | 351.743698 | 0.000000 | 0.352500 | 55.400000 | 139.450000 | 2242.000000 |
| АЧТВ | 184.0 | 16.610870 | 17.463210 | 0.000000 | 0.000000 | 23.000000 | 30.500000 | 90.000000 |
| Инфузия, % от N | 184.0 | 92.796612 | 62.792192 | 0.000000 | 54.192073 | 79.056962 | 113.939951 | 353.009259 |
| КИ | 184.0 | 3.619076 | 12.877508 | 0.000000 | 0.000000 | 0.000000 | 2.500000 | 130.000000 |
| Площадь тела | 184.0 | 0.900920 | 0.321340 | 0.250000 | 0.610000 | 0.850000 | 1.210000 | 1.390000 |
| Диурез, мл/кг | 184.0 | 39.406846 | 32.706270 | 0.000000 | 14.305556 | 30.740260 | 56.730769 | 205.384615 |
b0 = df[(df['OUTCOME']=='Died')&(df.Day==1)]
df[(df['OUTCOME']=='Died')&(df.Day==1)].describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 19.0 | 94.263158 | 35.529084 | 30.000000 | 78.500000 | 91.000000 | 95.500000 | 205.000000 |
| Day | 19.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 19.0 | 9.342105 | 5.659097 | 0.250000 | 5.125000 | 9.000000 | 14.000000 | 17.000000 |
| GT | 19.0 | 0.684211 | 0.477567 | 0.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 19.0 | 93.526316 | 24.541050 | 45.000000 | 72.500000 | 99.000000 | 111.000000 | 130.000000 |
| ДАД | 19.0 | 51.631579 | 18.294536 | 17.000000 | 40.000000 | 53.000000 | 65.000000 | 81.000000 |
| СрАД | 19.0 | 65.596491 | 19.754849 | 26.333333 | 49.166667 | 68.333333 | 80.166667 | 95.666667 |
| ЧСС | 19.0 | 108.421053 | 30.229338 | 54.000000 | 88.000000 | 110.000000 | 133.500000 | 160.000000 |
| ИА | 19.0 | 1.220780 | 0.421409 | 0.464000 | 0.970702 | 1.173333 | 1.443137 | 2.285714 |
| SpO2 | 19.0 | 94.473684 | 8.585313 | 70.000000 | 94.500000 | 98.000000 | 99.000000 | 100.000000 |
| Масса тела | 19.0 | 35.631579 | 19.723676 | 6.000000 | 20.000000 | 30.000000 | 50.000000 | 75.000000 |
| Cl- | 19.0 | 95.789474 | 44.842414 | 0.000000 | 100.000000 | 108.000000 | 118.000000 | 158.000000 |
| Лактат | 19.0 | 3.684211 | 5.908681 | 0.000000 | 0.000000 | 0.000000 | 5.050000 | 17.000000 |
| Амилаза | 19.0 | 19.005263 | 38.641665 | 0.000000 | 0.000000 | 0.000000 | 17.550000 | 137.000000 |
| АЛТ | 19.0 | 288.973684 | 686.046097 | 0.000000 | 39.500000 | 62.000000 | 156.000000 | 2865.000000 |
| АСТ | 19.0 | 341.663158 | 647.200154 | 0.000000 | 42.000000 | 110.000000 | 215.000000 | 2458.300000 |
| АЧТВ | 19.0 | 18.631579 | 23.497542 | 0.000000 | 0.000000 | 0.000000 | 31.500000 | 80.000000 |
| Инфузия, % от N | 19.0 | 127.466044 | 81.327040 | 0.000000 | 76.317203 | 112.291667 | 177.038684 | 300.176471 |
| КИ | 19.0 | 94.110526 | 228.739636 | 0.000000 | 0.000000 | 5.000000 | 21.750000 | 956.600000 |
| Площадь тела | 19.0 | 0.994211 | 0.357496 | 0.410000 | 0.670000 | 1.090000 | 1.300000 | 1.450000 |
| Диурез, мл/кг | 19.0 | 48.114514 | 41.013025 | 0.000000 | 19.583333 | 36.607143 | 70.465116 | 140.000000 |
# сравнение средних
a = pd.DataFrame(b0[(b0['OUTCOME']=='Died')&(b0['Day']==1)][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(a0[(a0['OUTCOME']=='Survived')&(a0['Day']==1)][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 9.342105 | 8.988207 |
| САД | 93.526316 | 107.000000 |
| ДАД | 51.631579 | 63.179348 |
| СрАД | 65.596491 | 77.786232 |
| ЧСС | 108.421053 | 110.809783 |
| ИА | 1.220780 | 1.081798 |
| SpO2 | 94.473684 | 98.173913 |
| Масса тела | 35.631579 | 36.005435 |
| Cl- | 95.789474 | 93.267391 |
| Лактат | 3.684211 | 1.627717 |
| Амилаза | 19.005263 | 36.880978 |
| АЛТ | 288.973684 | 115.638859 |
| АСТ | 341.663158 | 172.759076 |
| АЧТВ | 18.631579 | 16.610870 |
| Инфузия, % от N | 127.466044 | 92.796612 |
| КИ | 94.110526 | 3.619076 |
| Площадь тела | 0.994211 | 0.900920 |
| Диурез, мл/кг | 48.114514 | 39.406846 |
for i in a0.columns[2:-1]:
if i!='GT':
print(i)
sns.boxplot(data = [b0[i],a0[i]]);
plt.show()
Возраст
САД
ДАД
СрАД
ЧСС
ИА
SpO2
Масса тела
Cl-
Лактат
Амилаза
АЛТ
АСТ
АЧТВ
Инфузия, % от N
КИ
Площадь тела
Диурез, мл/кг
2
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное, воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[(df['OUTCOME']=='Survived')&(df.Day==1)&(df.GT==1)][i]
group1 = df[(df['OUTCOME']=='Died')&(df.Day==1)&(df.GT==1)][i]
alpha = 0.05
try:
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Получали ГТ, 1й день',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Получали ГТ, 1й день',i,'обнаружены значимые различия',p,alpha])
except Exception:
pass
print(f'Выживших, получавших ГТ: {group0.shape[0]}, умерших, получавших ГТ: {group1.shape[0]}')
Выживших, получавших ГТ: 75, умерших, получавших ГТ: 13
a1 = df[(df['OUTCOME']=='Survived')&(df.Day==1)&(df.GT==1)]
a1.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 75.0 | 108.093333 | 67.853812 | 3.000000 | 39.500000 | 116.000000 | 174.500000 | 215.000000 |
| Day | 75.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 75.0 | 8.862222 | 5.144140 | 0.666667 | 4.000000 | 9.000000 | 13.000000 | 17.000000 |
| GT | 75.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 75.0 | 107.160000 | 19.811299 | 50.000000 | 95.000000 | 108.000000 | 119.000000 | 155.000000 |
| ДАД | 75.0 | 62.013333 | 14.497431 | 20.000000 | 51.000000 | 62.000000 | 70.000000 | 100.000000 |
| СрАД | 75.0 | 77.062222 | 15.414366 | 30.000000 | 68.000000 | 78.000000 | 87.500000 | 113.333333 |
| ЧСС | 75.0 | 113.226667 | 22.916165 | 62.000000 | 98.000000 | 115.000000 | 122.000000 | 172.000000 |
| ИА | 75.0 | 1.118873 | 0.420857 | 0.412903 | 0.854497 | 1.076190 | 1.267943 | 2.800000 |
| SpO2 | 75.0 | 97.733333 | 8.679478 | 26.000000 | 98.000000 | 100.000000 | 100.000000 | 100.000000 |
| Масса тела | 75.0 | 36.473333 | 22.394632 | 8.500000 | 17.500000 | 30.000000 | 52.500000 | 100.000000 |
| Cl- | 75.0 | 89.880000 | 44.224892 | 0.000000 | 100.950000 | 105.800000 | 110.000000 | 200.400000 |
| Лактат | 75.0 | 1.688000 | 1.866921 | 0.000000 | 0.000000 | 1.400000 | 2.800000 | 9.000000 |
| Амилаза | 75.0 | 37.898667 | 69.860344 | 0.000000 | 0.000000 | 0.000000 | 46.500000 | 329.200000 |
| АЛТ | 75.0 | 106.433333 | 253.935550 | 0.000000 | 15.150000 | 27.400000 | 95.450000 | 1885.200000 |
| АСТ | 75.0 | 179.136000 | 337.656883 | 0.000000 | 26.000000 | 57.000000 | 179.450000 | 1958.500000 |
| АЧТВ | 75.0 | 16.122667 | 18.785558 | 0.000000 | 0.000000 | 0.000000 | 29.400000 | 90.000000 |
| Инфузия, % от N | 75.0 | 88.578770 | 62.288725 | 0.000000 | 53.624429 | 75.583333 | 112.952489 | 353.009259 |
| КИ | 75.0 | 3.668800 | 10.734883 | 0.000000 | 0.000000 | 0.000000 | 3.850000 | 80.000000 |
| Площадь тела | 75.0 | 0.909867 | 0.300739 | 0.250000 | 0.610000 | 0.970000 | 1.150000 | 1.390000 |
| Диурез, мл/кг | 75.0 | 40.812975 | 32.523385 | 1.571429 | 13.039683 | 32.916667 | 62.019231 | 179.166667 |
b1 = df[(df['OUTCOME']=='Died')&(df.Day==1)&(df.GT==1)]
b1.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 13.0 | 96.461538 | 40.879121 | 30.000000 | 80.000000 | 91.000000 | 96.000000 | 205.000000 |
| Day | 13.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 13.0 | 8.423077 | 5.449416 | 0.250000 | 5.000000 | 6.666667 | 14.000000 | 17.000000 |
| GT | 13.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| САД | 13.0 | 91.153846 | 26.635960 | 45.000000 | 70.000000 | 90.000000 | 110.000000 | 130.000000 |
| ДАД | 13.0 | 48.615385 | 18.768495 | 17.000000 | 30.000000 | 52.000000 | 65.000000 | 78.000000 |
| СрАД | 13.0 | 62.794872 | 20.595099 | 26.333333 | 46.666667 | 68.333333 | 80.000000 | 93.000000 |
| ЧСС | 13.0 | 101.307692 | 31.784128 | 54.000000 | 80.000000 | 100.000000 | 120.000000 | 160.000000 |
| ИА | 13.0 | 1.181043 | 0.447806 | 0.464000 | 0.950495 | 1.173333 | 1.333333 | 2.285714 |
| SpO2 | 13.0 | 94.615385 | 8.539501 | 70.000000 | 93.000000 | 99.000000 | 99.000000 | 100.000000 |
| Масса тела | 13.0 | 34.076923 | 21.355958 | 6.000000 | 20.000000 | 25.000000 | 50.000000 | 75.000000 |
| Cl- | 13.0 | 96.076923 | 45.257525 | 0.000000 | 100.000000 | 105.000000 | 116.000000 | 158.000000 |
| Лактат | 13.0 | 3.500000 | 5.772204 | 0.000000 | 0.000000 | 0.000000 | 4.100000 | 17.000000 |
| Амилаза | 13.0 | 14.615385 | 39.582274 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 137.000000 |
| АЛТ | 13.0 | 361.407692 | 828.019596 | 0.000000 | 38.000000 | 47.000000 | 66.000000 | 2865.000000 |
| АСТ | 13.0 | 380.953846 | 767.014185 | 0.000000 | 45.000000 | 94.000000 | 120.700000 | 2458.300000 |
| АЧТВ | 13.0 | 18.692308 | 24.526804 | 0.000000 | 0.000000 | 0.000000 | 32.000000 | 80.000000 |
| Инфузия, % от N | 13.0 | 144.509492 | 80.877468 | 58.823529 | 89.164087 | 112.291667 | 190.833333 | 300.176471 |
| КИ | 13.0 | 109.353846 | 266.338934 | 0.000000 | 0.000000 | 5.000000 | 16.000000 | 956.600000 |
| Площадь тела | 13.0 | 1.140769 | 0.305790 | 0.490000 | 1.090000 | 1.210000 | 1.330000 | 1.450000 |
| Диурез, мл/кг | 13.0 | 47.515140 | 35.791409 | 0.000000 | 20.000000 | 43.000000 | 70.000000 | 132.608696 |
# сравнение средних
a = pd.DataFrame(b1[(b1['OUTCOME']=='Died')&(b1['GT']==1)][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(a1[(a1['OUTCOME']=='Survived')&(a1['GT']==1)][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 8.423077 | 8.862222 |
| САД | 91.153846 | 107.160000 |
| ДАД | 48.615385 | 62.013333 |
| СрАД | 62.794872 | 77.062222 |
| ЧСС | 101.307692 | 113.226667 |
| ИА | 1.181043 | 1.118873 |
| SpO2 | 94.615385 | 97.733333 |
| Масса тела | 34.076923 | 36.473333 |
| Cl- | 96.076923 | 89.880000 |
| Лактат | 3.500000 | 1.688000 |
| Амилаза | 14.615385 | 37.898667 |
| АЛТ | 361.407692 | 106.433333 |
| АСТ | 380.953846 | 179.136000 |
| АЧТВ | 18.692308 | 16.122667 |
| Инфузия, % от N | 144.509492 | 88.578770 |
| КИ | 109.353846 | 3.668800 |
| Площадь тела | 1.140769 | 0.909867 |
| Диурез, мл/кг | 47.515140 | 40.812975 |
for i in a1.columns[2:-1]:
if i!='GT':
print(i)
sns.boxplot(data = [b1[i],a1[i]]);
plt.show()
Возраст
САД
ДАД
СрАД
ЧСС
ИА
SpO2
Масса тела
Cl-
Лактат
Амилаза
АЛТ
АСТ
АЧТВ
Инфузия, % от N
КИ
Площадь тела
Диурез, мл/кг
3
# т.к. выборки разного размера, в одной из них - мало данных, распределение не нормальное, воспользуемся тестом Краскела-Уоллиса
for k,i in enumerate(target_columns[2:-1]):
group0 = df[(df['OUTCOME']=='Survived')&(df.Day==1)&(df.GT==0)][i]
group1 = df[(df['OUTCOME']=='Died')&(df.Day==1)&(df.GT==0)][i]
alpha = 0.05
try:
test_value, p = stats.kruskal(group0,group1)
if alpha<p:
append_list.append(['Не получали ГТ, 1й день',i,'значимость различия не доказана',p,alpha])
else:
append_list.append(['Не получали ГТ, 1й день',i,'обнаружены значимые различия',p,alpha])
except Exception:
pass
print(f'Выживших, не получавших ГТ: {group0.shape[0]}; умерших, не получавших ГТ: {group1.shape[0]}')
Выживших, не получавших ГТ: 109; умерших, не получавших ГТ: 6
a2 = df[(df['OUTCOME']=='Survived')&(df.Day==1)&(df.GT==0)]
a2.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 109.0 | 103.119266 | 61.300976 | 1.000000 | 51.000000 | 105.000000 | 152.000000 | 216.000000 |
| Day | 109.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 109.0 | 9.074893 | 5.525062 | 0.250000 | 4.000000 | 8.000000 | 14.000000 | 18.000000 |
| GT | 109.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| САД | 109.0 | 106.889908 | 17.218820 | 70.000000 | 94.000000 | 110.000000 | 120.000000 | 159.000000 |
| ДАД | 109.0 | 63.981651 | 13.024181 | 30.000000 | 57.000000 | 60.000000 | 70.000000 | 119.000000 |
| СрАД | 109.0 | 78.284404 | 13.481875 | 43.333333 | 70.000000 | 77.333333 | 86.666667 | 117.333333 |
| ЧСС | 109.0 | 109.146789 | 22.503837 | 40.000000 | 92.000000 | 110.000000 | 124.000000 | 165.000000 |
| ИА | 109.0 | 1.056287 | 0.321774 | 0.407692 | 0.807692 | 1.000000 | 1.166667 | 2.133333 |
| SpO2 | 109.0 | 98.477064 | 3.354368 | 70.000000 | 98.000000 | 100.000000 | 100.000000 | 100.000000 |
| Масса тела | 109.0 | 35.683486 | 21.863916 | 6.000000 | 16.000000 | 30.000000 | 50.000000 | 103.000000 |
| Cl- | 109.0 | 95.598165 | 37.935208 | 0.000000 | 100.900000 | 107.000000 | 113.000000 | 148.000000 |
| Лактат | 109.0 | 1.586239 | 2.735279 | 0.000000 | 0.000000 | 1.000000 | 2.500000 | 25.000000 |
| Амилаза | 109.0 | 36.180734 | 62.643695 | 0.000000 | 0.000000 | 15.300000 | 51.000000 | 533.500000 |
| АЛТ | 109.0 | 121.972936 | 242.462407 | 0.000000 | 11.000000 | 32.600000 | 93.600000 | 1260.700000 |
| АСТ | 109.0 | 168.371284 | 362.595774 | 0.000000 | 0.000000 | 53.000000 | 134.000000 | 2242.000000 |
| АЧТВ | 109.0 | 16.946789 | 16.573012 | 0.000000 | 0.000000 | 23.500000 | 31.000000 | 54.100000 |
| Инфузия, % от N | 109.0 | 95.698797 | 63.258685 | 0.000000 | 56.410256 | 79.166667 | 116.761364 | 295.701754 |
| КИ | 109.0 | 3.584862 | 14.213657 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 130.000000 |
| Площадь тела | 109.0 | 0.894763 | 0.336009 | 0.250000 | 0.610000 | 0.850000 | 1.210000 | 1.390000 |
| Диурез, мл/кг | 109.0 | 38.439326 | 32.946333 | 0.000000 | 15.500000 | 29.777778 | 54.000000 | 205.384615 |
b2 = df[(df['OUTCOME']=='Died')&(df.Day==1)&(df.GT==0)]
b2.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| ID | 6.0 | 89.500000 | 22.223861 | 66.000000 | 76.500000 | 85.500000 | 94.500000 | 129.000000 |
| Day | 6.0 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
| Возраст | 6.0 | 11.333333 | 6.088240 | 1.000000 | 9.000000 | 12.500000 | 16.000000 | 17.000000 |
| GT | 6.0 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| САД | 6.0 | 98.666667 | 20.471118 | 70.000000 | 84.750000 | 102.500000 | 110.500000 | 125.000000 |
| ДАД | 6.0 | 58.166667 | 16.869104 | 40.000000 | 43.250000 | 58.000000 | 69.750000 | 81.000000 |
| СрАД | 6.0 | 71.666667 | 17.953025 | 50.000000 | 57.083333 | 72.833333 | 83.333333 | 95.666667 |
| ЧСС | 6.0 | 123.833333 | 21.179392 | 88.000000 | 114.500000 | 130.000000 | 138.750000 | 144.000000 |
| ИА | 6.0 | 1.306877 | 0.380837 | 0.888889 | 1.031304 | 1.212792 | 1.630896 | 1.785714 |
| SpO2 | 6.0 | 94.166667 | 9.495613 | 75.000000 | 96.250000 | 97.500000 | 98.750000 | 100.000000 |
| Масса тела | 6.0 | 39.000000 | 16.911535 | 12.000000 | 29.500000 | 45.000000 | 50.000000 | 56.000000 |
| Cl- | 6.0 | 95.166667 | 48.193015 | 0.000000 | 102.000000 | 108.000000 | 117.000000 | 135.000000 |
| Лактат | 6.0 | 4.083333 | 6.741043 | 0.000000 | 0.000000 | 0.750000 | 4.875000 | 17.000000 |
| Амилаза | 6.0 | 28.516667 | 38.164927 | 0.000000 | 0.000000 | 17.550000 | 38.025000 | 97.000000 |
| АЛТ | 6.0 | 132.033333 | 75.472503 | 22.500000 | 87.000000 | 143.500000 | 172.175000 | 232.800000 |
| АСТ | 6.0 | 256.533333 | 288.563412 | 0.000000 | 69.750000 | 215.000000 | 270.700000 | 798.600000 |
| АЧТВ | 6.0 | 18.500000 | 23.321664 | 0.000000 | 0.000000 | 12.500000 | 27.250000 | 58.000000 |
| Инфузия, % от N | 6.0 | 90.538574 | 75.632715 | 0.000000 | 27.083333 | 115.199055 | 122.859944 | 189.708333 |
| КИ | 6.0 | 61.083333 | 127.271527 | 0.000000 | 1.250000 | 9.500000 | 24.125000 | 320.000000 |
| Площадь тела | 6.0 | 0.676667 | 0.242542 | 0.410000 | 0.475000 | 0.670000 | 0.820000 | 1.030000 |
| Диурез, мл/кг | 6.0 | 49.413156 | 54.571310 | 0.000000 | 8.333333 | 34.970238 | 74.055632 | 140.000000 |
# сравнение средних
gt_1day_users = df.loc[(df.Day==1)&(df.GT==1),'ID'].unique()
a = pd.DataFrame(b2[(b2['OUTCOME']=='Died')&(b2['GT']==0)&(~b2.ID.isin(gt_1day_users))][target_columns[2:-1]].drop('GT',axis=1).mean()).rename(columns = {0:'Группа 1: умерли'})
a_ = []
for i in target_columns[2:-1]:
if i != 'GT':
a_.append(a2[(a2['OUTCOME']=='Survived')&(a2['GT']==0)&(~a2.ID.isin(gt_1day_users))][i].mean())
a['Группа 2: выжили'] = a_
a
| Группа 1: умерли | Группа 2: выжили | |
|---|---|---|
| Возраст | 11.333333 | 9.074893 |
| САД | 98.666667 | 106.889908 |
| ДАД | 58.166667 | 63.981651 |
| СрАД | 71.666667 | 78.284404 |
| ЧСС | 123.833333 | 109.146789 |
| ИА | 1.306877 | 1.056287 |
| SpO2 | 94.166667 | 98.477064 |
| Масса тела | 39.000000 | 35.683486 |
| Cl- | 95.166667 | 95.598165 |
| Лактат | 4.083333 | 1.586239 |
| Амилаза | 28.516667 | 36.180734 |
| АЛТ | 132.033333 | 121.972936 |
| АСТ | 256.533333 | 168.371284 |
| АЧТВ | 18.500000 | 16.946789 |
| Инфузия, % от N | 90.538574 | 95.698797 |
| КИ | 61.083333 | 3.584862 |
| Площадь тела | 0.676667 | 0.894763 |
| Диурез, мл/кг | 49.413156 | 38.439326 |
for i in a2.columns[2:-1]:
if i!='GT':
print(i)
sns.boxplot(data = [b2[i],a2[i]]);
plt.show()
Возраст
САД
ДАД
СрАД
ЧСС
ИА
SpO2
Масса тела
Cl-
Лактат
Амилаза
АЛТ
АСТ
АЧТВ
Инфузия, % от N
КИ
Площадь тела
Диурез, мл/кг
for i in b1.columns[2:-1]:
if i!='GT':
print(i)
sns.boxplot(data = [b1[i],b2[i]]);
plt.show()
Возраст
САД
ДАД
СрАД
ЧСС
ИА
SpO2
Масса тела
Cl-
Лактат
Амилаза
АЛТ
АСТ
АЧТВ
Инфузия, % от N
КИ
Площадь тела
Диурез, мл/кг
Результаты проведенного анализа по исходам заболеваний
df_results = pd.DataFrame(append_list)
df_results.columns = columns
df_results = df_results.pivot(columns = 'Вариант',index = 'Показатель',values = 'p_value').drop('GT',axis=0).style.applymap(highlight_greaterthan)
df_results
| Вариант | Все пациенты | Все пациенты, 1й день | Не получали ГТ | Не получали ГТ, 1й день | Получали ГТ | Получали ГТ, 1й день |
|---|---|---|---|---|---|---|
| Показатель | ||||||
| Cl- | 0.000000 | 0.520005 | 0.005549 | 0.668441 | 0.000011 | 0.583266 |
| SpO2 | 0.000000 | 0.000883 | 0.000000 | 0.049058 | 0.000000 | 0.007972 |
| АЛТ | 0.000000 | 0.032205 | 0.010798 | 0.050053 | 0.000000 | 0.173089 |
| АСТ | 0.000000 | 0.121839 | 0.065848 | 0.174516 | 0.000000 | 0.356569 |
| АЧТВ | 0.000103 | 0.930465 | 0.002221 | 0.811024 | 0.120364 | 0.631109 |
| Амилаза | 0.000000 | 0.072585 | 0.000000 | 0.811612 | 0.000000 | 0.054880 |
| Возраст | 0.000040 | 0.757969 | 0.279320 | 0.322632 | 0.000201 | 0.859691 |
| ДАД | 0.000000 | 0.013720 | 0.000510 | 0.488728 | 0.000458 | 0.018939 |
| Диурез, мл/кг | 0.759487 | 0.455305 | 0.088612 | 0.919840 | 0.207432 | 0.476787 |
| ИА | 0.002620 | 0.085650 | 0.091606 | 0.077196 | 0.027207 | 0.498897 |
| Инфузия, % от N | 0.287204 | 0.024974 | 0.091712 | 0.811121 | 0.332342 | 0.010013 |
| КИ | 0.000000 | 0.000076 | 0.000000 | 0.005848 | 0.000000 | 0.007004 |
| Лактат | 0.332688 | 0.878231 | 0.091322 | 0.824679 | 0.830641 | 0.722964 |
| Масса тела | 0.000020 | 0.903589 | 0.146036 | 0.614459 | 0.000384 | 0.823032 |
| Площадь тела | 0.517396 | 0.260281 | 0.121842 | 0.112477 | 0.010713 | 0.011645 |
| САД | 0.000000 | 0.027996 | 0.006317 | 0.334520 | 0.000003 | 0.041469 |
| СрАД | 0.000000 | 0.017992 | 0.001110 | 0.424219 | 0.000060 | 0.023892 |
| ЧСС | 0.914050 | 0.864722 | 0.722759 | 0.103120 | 0.667207 | 0.145632 |